Python3 Django的View详解

Python3 Django的View详解


本文由 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

URLconf

路径配置URL

  • 根路径寻找: manage.py__main__ -> Django_view.settings -> settings.pyROOT_URLCONF = 'Django_view.urls' -> urls.py里配置就是根路径
  • 在应用下创建urls.py用于存放该应用的相关路径
    • 在项目的urls.py文件中的urlpatterns列表中添加path('booktest/', include('booktest.urls')), 这样该应用相关的url都交给该应用的urls.py匹配
  • 重复开发步骤
    • 编写views.py
      • def index(request): pass
    • 应用的urls.pyurlpatterns添加路径
      • path('', views.index),
  • 启动服务器python manage.py runserver 80

Path路径匹配

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 = ['*']
  • 创建错误视图: 404(页面丢失) / 500(服务出错) / 400(请求错误) / 403(权限不足)

HttpRequest请求对象

# --- 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))

接收Json数据

  • 当使用POST方式访问Django时, 如果不是'Content-Type':'application/x-www-form-urlencoded', 那么你将获取不到数据()
  • 可参考<一个POST请求保存数据到Model的案例>处理方式.

HTTPResponse响应对象

# --- 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'})

session当前会话对象

# --- 当前会话 ---
'''
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})

一个POST请求保存数据到Model的案例

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)

你可能感兴趣的:(Python)