一、前言
参考个人 JavaEE 开发的经验,这次借助 Django 框架使用 Python 语言来实现 web 开发 高频的 常规操作:尽在代码中
WEB | 参考文章 |
---|---|
1、Get/Post请求 | |
2、文件上传 | |
3、数据分页 | |
4、前后端分离ajax交互 | |
5、设置时区 | |
6、使用MySQL | Dajango 数据库切换为MYSQL的问题:Error loading MySQLdb module.解决方案 |
7、访问解决访问ip限制 | |
8、csrf_token 解决 |
Git代码地址:https://github.com/larger5/mysql_django.git
其他的,日后有空有心情再更新
二、代码
M+V+T+url+settings
2.1.M-models.py(看看就好)
from django.db import models
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)
bpub_date = models.DateTimeField()
bread = models.IntegerField(default=0)
bcommet = models.IntegerField(default=0)
isDelete = models.BooleanField(default=False)
class Meta:
db_table = 'booktest_bookinfo'
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)
hgender = models.BooleanField(default=True)
isDelete = models.BooleanField(default=False)
hcontent = models.CharField(max_length=100)
hbook = models.ForeignKey('BookInfo',on_delete=models.CASCADE) # 注意后面 Django2.0 必备
class Meta:
db_table = 'booktest_heroinfo'
2.2.V-views.py
# -*- coding:utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from .models import *
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings # 获取 settings.py 里边配置的信息
import os
from django.core.paginator import Paginator
from django.http import JsonResponse
from django.core import serializers
# 1.1.进入首页
def index(request):
return render(request,"booktest/index.html")
# 2.GET 请求测试
def getTest(request):
a=request.GET['a']
b=request.GET['b']
context = {'a': a, 'b': b}
return render(request, 'booktest/showTest.html', context)
# 3.POST 请求测试
# @csrf_exempt # 没有这个注解就没有权限调用 # 或者在form 中加入 {% csrf_token %}
def postTest(request):
itaem=request.POST['itaem']
context={'itaem':itaem}
return render(request, 'booktest/showTest.html', context)
# 4.文件上传测试
def upload(request):
if request.method == "POST":
f1 = request.FILES['pic']
fname = os.path.join(settings.MEDIA_ROOT,f1.name)
with open(fname, 'wb') as pic:
for c in f1.chunks():
pic.write(c)
return HttpResponse("<img src='/static/media/%s'></img>"%f1.name)
else:
return HttpResponse("error")
# 5.分页显示数据
def pagTest(request, pIndex):
data = HeroInfo.objects.all()
# 每页数量
data_size = Paginator(data, 5)
if pIndex == '':
pIndex = '1'
pIndex = int(pIndex)
# 选页
data_size_page = data_size.page(pIndex)
plist = data_size.page_range
return render(request, 'booktest/showTest.html', {'list': data_size_page, 'plist': plist, 'pIndex': pIndex})
# 6.返回 json 字符串
def getJson(request):
temp = BookInfo.objects.all()
data = []
# 必须全为字典的格式
for a in temp:
data.append({'id': a.id, 'title': a.btitle,"bcommet":a.bcommet,"bpub_date":a.bpub_date,"isDelete":a.isDelete,"bread":a.bread})
return JsonResponse({'data': data})
2.3.T-index.html+showTest.html
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TEST</title>
</head>
<body>
<h1>1.Test GET</h1>
<a href="/getTest/?a=1&b=2">get</a><br>
<h1>2.Test POST</h1>
<form method="post" action="/postTest/">
{% csrf_token %}
<input name="itaem" id="itaem" placeholder="itaem">
<input type="submit" value="提交"/>
</form>
<h1>3.文件上传</h1>
<form method="post" action="upload/" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="pic"/><br>
<input type="submit" value="上传">
</form>
</body>
</html>
showTest
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>show</title>
</head>
<body>
<h1>5.分页</h1>
a:{{ a }}
<hr>
b:{{ b }}
<hr>
itaem:{{ itaem }}
<hr>
<hr>
<ul>
{%for hero in list%}
<li>{{hero.hname}}</li>
{%endfor%}
</ul>
{%for pindex in plist%}
{%if pIndex == pindex%}
{{pindex}}
{%else%}
<a href="/pag{{pindex}}/">{{pindex}}</a>
{%endif%}
{%endfor%}
<h1>6.json</h1>
<a href="http://localhost:8080/getJson">getJson</a>
</body>
</html>
2.4.url
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from booktest import views
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^index$', views.index),
url(r'^getTest/$', views.getTest),
url(r'^postTest/$',views.postTest),
url(r'^upload/$',views.upload),
url(r'^pag(?P<pIndex>[0-9]*)/$', views.pagTest, name='pagTest'),
url(r'^getJson$', views.getJson),
]
2.5.settings
import os
import pymysql # 注意要加上这些
pymysql.install_as_MySQLdb() # 注意要加上这些
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'uj%gwok)4i-=4^a*cu_-(yr)v)jlcsb11r2(+@&+o+o)7+plvw'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# 解决访问限制
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'booktest', # 注意引入自己的模块
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'MysqlPython.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'MysqlPython.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'itaem', # 数据库名
'USER': 'root', # 数据库用户名
'PASSWORD': '123', # 数据库密码
'HOST': '120.79.197.130', # 数据库地址
'PORT': '3307', # 数据库端口号,默认3306
}
}
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
#设置时区
LANGUAGE_CODE = 'zh-hans' #中文支持,django1.8以后支持;1.8以前是zh-cn
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False #默认是Ture,时间是utc时间,由于我们要用本地时间,所用手动修改为false!!!!
# 图片访问的路径
STATIC_URL = '/static/'
# 图片存放的路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
# 图片上传的路径
MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")
三、小结
解决测试代码时 Django post CSRF verification failed. Request aborted.的问题(任选其一)
① {% csrf_token %}
如:
<h1>2.Test POST</h1>
<form method="post" action="/postTest/">
{% csrf_token %}
<input name="itaem" id="itaem" placeholder="itaem">
<input type="submit" value="提交"/>
</form>
② 在 views 中的方法上加上 @csrf_exempt
# 3.POST 请求测试
@csrf_exempt
def postTest(request):
itaem=request.POST['itaem']
context={'itaem':itaem}
return render(request, 'booktest/showTest.html', context)