本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.csdn.net/Rozol/article/details/79526328
以下代码以Python3.6.1为例
Less is more!
Python 3.6.1
Django 2.0.2
项目名: Django_view 应用名: booktest
manage.py
的__main__
-> Django_view.settings
-> settings.py
的ROOT_URLCONF = 'Django_view.urls'
-> urls.py
里配置就是根路径urls.py
用于存放该应用的相关路径
urls.py
文件中的urlpatterns
列表中添加path('booktest/', include('booktest.urls'))
, 这样该应用相关的url都交给该应用的urls.py
匹配def index(request): pass
urls.py
的urlpatterns
添加路径
path('', views.index),
python manage.py runserver 80
from django.urls import path, register_converter, re_path
from . import views, converters
# 注册自定义转换器
register_converter(converters.NumberConverter, 'mt')
'''
<>用于从url中捕获数据
路径转换器
--- 默认 ---
str: 字符串
int: int数字
slug: ASCII字母+数字+连字符+下划线组成的字符串, 例如: a-b-c1-d
uuid: UUID(必须包含-, 字母小写), 例如: 123a-213b-22d2f
path: 匹配任何非空字符串(含'/')
--- 自定义 ---
converters编写转换器 -> register_converter注册 -> 使用
--- 正则 ---
使用re_path匹配, 语法: ?Ppattern
反转解析URL
1. 给 path 添加名字 path('', views.index, name='index')
2. 使用 reverse('year', args=(year,)) 反转解析
'''
urlpatterns = [
path('', views.index, name='index'), # 严格匹配
path('' , views.detail, name='detail'), # 获取数字
path('times///' , views.times, name='times'), # name参数用于反转解析
path('mon/' , views.mon, name="mon"), # 使用自定义转换器
re_path('times/(?P[0-9]{4})/(?P[0-9]{2})/' , views.times, name='times'), # 正则表达式, 接收的都是字符串
path('year//' , views.year, name='year'), # 反转解析URL
]
-
# 自定义路径转换器
class NumberConverter:
regex = '[0-9]{2}' # 正则表达式
# 将匹配的字符串转换为传递给view的类型, 转换失败抛ValueError异常
def to_python(self, value):
return int(value)
# 将Python类型转换为在URL中使用的字符串
def to_url(self, value):
return '%d' % value
settings.py
中修改: 'DIRS': [os.path.join(BASE_DIR), 'templates'],
settings.py
中修改: DEBUG = False
settings.py
中修改: ALLOWED_HOSTS = ['*']
# --- Request ---
'''
Request主要参数
request.path # 应用全路径
request.method # GET/ POST
request.encoding # 字符集, 默认utf8
request.GET # get的所有参数
request.POST # post的所有参数
request.FILES # 所有的上传文件
request.COOKIES # 所有的cookie
request.session # 当前会话
'''
# --- GET ---
def get_request(request):
# /getrequest/?a=1&b=2 一个键对应一个值
a = request.GET['a']
b = request.GET['b']
c = 0
# return HttpResponse("a: {}, b:{}, c:{}".format(a, b, c)) # a: 1, b:2, c:0
# /getrequest/?a=1&a=2&b=3 一个键对应多个值
a_all = request.GET.getlist('a')
# return HttpResponse("a_all: {}".format(a_all)) # a_all: ['1', '2']
# 用于提交测试post的表单 (注: 需要使用跨站请求伪造保护标签 {% csrf_token %} )
def post_test(request):
return render(request, 'booktest/posttest.html')
# --- POST ---
'''
主要属性
response.content: 返回的内容
response.charset: 字符集
response.status_code: 响应状态码
content-type: 输出的MIME类型
主要方法
response.write(content): 写
response.flush(): 刷新缓存区
response.set_cookie(key, value='', max_age=None, expires=None):设置cookie, max_age为int数值, expires为datetime时间, 二选一
response.delete_cookie(key): 删除cookie
'''
def post_request(request):
name = request.POST['name']
hobby = request.POST.getlist('hobby')
return HttpResponse("name: {}, hobby:{}".format(name, hobby))
'Content-Type':'application/x-www-form-urlencoded'
, 那么你将获取不到数据(# --- Response ---
def response(request):
# response = HttpResponse()
# response.set_cookie('key', 'value')
# return response
# 子类 HttpResponseRedirect 重定向(简写: redirect)
# return redirect(reverse('post_test', args=()))
# 子类 JsonResponse 返回json数据
# return JsonResponse({'key': 'value'})
# 渲染模板的简写
return render(request, 'booktest/posttest.html', {'key': 'value'})
# --- 当前会话 ---
'''
settings.py中INSTALLED_APPS添加'django.contrib.messages' (默认已有)
MIDDLEWARE添加'django.contrib.sessions.middleware.SessionMiddleware' (默认已有)
使用session之前需要先执行数据迁移
常用方法:
get(key, default=None): 根据key获取会话的value
has_key(key): 是否存在该key
set_expiry(0): 设置session过期时间: 默认-两星期, int-秒, timedelta(days=5)-加上该时间, 0-浏览器关闭, None-不过期
clear(): 清除所有会话
flush(): 删除当前的会话及其Cookie
del request.session['member_id']: 删除指定会话
session的存储位置(`settings.py`中配置)
SESSION_ENGINE='django.contrib.sessions.backends.db' # 默认, 存到数据库中
SESSION_ENGINE='django.contrib.sessions.backends.cache' # 存到文件中
SESSION_ENGINE='django.contrib.sessions.backends.cached_db' # 文件和数据库同时使用
'''
def session(request):
# 设置(不同页面)
request.session['name'] = 'abcde'
name = '无'
# 获取(不同页面)
boolean = request.session.has_key('name')
if boolean:
name = request.session['name']
request.session.set_expiry(0)
return render(request, 'booktest/session.html', {'name': name})
import sys
import django
from django.shortcuts import render
from django.http import *
import json
from AppRecorder.models import *
def update(request):
for key in request.POST.items():
response_json = key[0]
break
fail = []
for item_json in json.loads(response_json):
try:
bean = AppInfo()
bean.app_icon = item_json['icon']
bean.app_name = item_json['name']
bean.app_version = item_json['version']
bean.app_packageName = item_json['packageName']
bean.app_addTime = item_json['addTime']
bean.app_mark = MarkShelf.objects.first()
bean.app_type = TypeShelf.objects.first()
bean.app_category = CategoryShelf.objects.first()
bean.save()
print(bean)
except django.db.utils.IntegrityError:
print("该数据已存在, 不允许在添加: {}".format(bean.app_packageName))
except:
fail.append(bean.app_packageName)
types, value, back = sys.exc_info()
sys.excepthook(types, value, back)
fail_json = json.dumps(fail, indent=4, default=lambda obj: obj.__dict__)
return HttpResponse(fail_json)