View 视图2
View 视图
一、概述
- 作用
接收web请求返回web响应 - 本质
一个python函数 - 请求
客服端给服务端的数据 - 响应
类别很多
重定向 404访问不到 报错后的消息 json数据
二、路由
1、概述与配置
路由称为route 是一种与视图的关系映射
路由是把客户端的请求应用程序进行一对一的绑定映射
注意:路由唯一性
2、配置
ROOT_URLCONF = 'day2django.urls'
默认配置好的
3、url进行重新分配
-
目录层级
project
App
urls.py
project
urls.py
manage.py
在应用App下创建urls.py
在project下的urls里 使用include进行关联 -
App/urls.py
from django.urls import path
from . import viewsurlpatterns = [ # 首页的路由配置 path('index/', views.index), ] -
project/urls.py
from django.contrib import admin
from django.urls import path, includeurlpatterns = [ path('admin/', admin.site.urls), path('', include('App.urls')), ] -
include
-
导入
from django.urls import path, include -
作用
找到子路由模块 -
参数
- 子路由模块路径
- 命名空间namespace(用于反向解析 动态构造路由地址)
-
实例
path('', include(('App.urls','App'), namespace='App')), -
多个子路由模块
from django.contrib import admin
from django.urls import path, includeurlpatterns = [ path('admin/', admin.site.urls), path('App/', include(('App.urls','App'), namespace='App')), path('App2/', include(('App2.urls','App2'), namespace='App2')), ]注意:如果说子路由前面添加了前缀 访问的时候 就要添加上
http://127.0.0.1:8000/app/index/
-
三、视图
1、配置
-
位置
App/views.py 视图写在views.py文件中 -
注意
无论当前是否有参数 都必须有一个req参数 接受请求过来的对象 -
路由
对视图函数进行映射 -
实例
from django.shortcuts import render, HttpResponse# Create your views here. def index(request): return HttpResponse('index') -
路由方法
匹配方式: 当django进行请求的时候 他会从 urlpattern进行依次匹配 直到匹配出匹配项 否则404- path 类似正则表达式 是一个匹配url的准则
- re_path 正则匹配路由
2、路由方法
-
path
参数- route 书写匹配url
- view 当django匹配到了url 就会执行特定的视图函数
- name 为url进行取名 目的是在任何位置 都能反向解析出当前路由地址
实例
path('index/', views.index, name='index'),
-
re_path
参数- route 书写正则表达式的路由地址
- view 当django匹配到了url 就会执行特定的视图函数
- name 为url进行取名 目的是在任何位置 都能反向解析出当前路由地址
re_path(r'^index2/$', views.index, name='index2'),
完全匹配 如果不添加^$ 路由中包含index2就可以访问了
-
注意
一个视图函数可以存在多个路由地址
from django.urls import path
from django.urls import re_pathfrom . import views urlpatterns = [ # 首页的路由配置 path(r'', views.index, name='index1'), path(r'index/', views.index, name='index2'), re_path(r'^index2/$', views.index, name='index3'), ]
3、定义视图
-
无参视图
路由地址
path(r'', views.index, name='index1'),
视图函数
from django.shortcuts import render, HttpResponse# Create your views here. def index(request): print(request) return HttpResponse('index') -
带参数路由
传递参数 视图函数需要接受参数- path
# 不限定参数类型
path(r'args// /', views.args, name='args1'),
# 限定参数类型为字符串和整数
path(r'args/str:name/int:age/', views.args, name='args'),
# 名字和视图函数参数对应的 不能随便写
path(r'args/str:name/int:age1/', views.args, name='args'),
# 作为了解 会认为name参数后面的所有 都为参数
path(r'args/str:name/path:age/', views.args, name='args'), - re_path
# 不起名称的传参
re_path(r'args/(\w+)/(\d{2})/', views.args, name='args'),
# 起名称的传参 名字和视图函数参数对应的 不能随便写
re_path(r'^args/(?P\w+)/(?P \d{2})/$', views.args, name='args'),
参数限定类型 如果类型不匹配则为404 参数匹配成功类型为str
- path
4、限制请求类型
from django.shortcuts import render, HttpResponse
from django.views.decorators.http import require_http_methods
# Create your views here.
@require_http_methods(['POST'])
def index(request):
print(request)
return HttpResponse('index')
允许类型写在require_http_methods(['POST']) 列表里 只有写在里面的请求方式 才是允许的
如果不使用当前装饰器则为 允许所有请求类型
5、错误视图
-
下面是常见的HTTP状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
-
配置模板路径
settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')] -
更改DEBUG
settings.py
DEBUG = FalseALLOWED_HOSTS = ['*'] -
目录层级
project/
App/
project/
templates/
404.html
500.html -
404模板定制
在templates下创建404.html -
500模板定制
在templates下创建500.html
四、请求对象request
1、概述与作用
- 作用
客户端给服务器端传递数据用的 - 概述
- 服务器端接受http协议请求以后 会根据请求创建出请求对象
- 视图函数的第一个参数 为request
- request保存客户端传递过来的数据
2、属性
- path 请求的完整路径 不包含域名和端口
- method 请求的方式
- GET 类似字典对象 包含get请求的所有参数
- POST 类似字典对象 包含post请求的所有参数
- FILES 接受文件上传
- COOKIES 一个包含了字典的所有cookie
- session 包含了当前session值的对象 表示当前会话消息
- META 包含了http请求的所有头信息
实例
# 测试请求对象
def test_req(req):
print('path', req.path)
print('method', req.method)
print('GET',req.GET)
print('POST', req.POST)
print('FILES', req.FILES)
print('COOKIES', req.COOKIES)
print('session', req.session)
print('META', req.META)
print('META', req.META['HTTP_USER_AGENT'])
return HttpResponse('请求对象')
3、方法
- get_full_path() 获取完整请求
- get_host() 请求的主机和端口
- is_ajax() 是否为ajax请求
4、GET传参的方式
- 方式
- 通过路由进行传参
- url拼接get传参
- 实例
- 通过路由进行传参 视图函数设置相关形参 直接打印形参可获得值
path(r'args// /', views.args, name='args1'),
path(r'args/str:name/int:age/', views.args, name='args'),
def test(req, name, age):
return HttpResponse('请求对象')
注意 需要在视图函数上进行接收 - url拼接get传参 GET接收
使用get方法接收
在url地址中 使用?的形式进行拼接
请求地址:127.0.0.1:8000?key=value&key=value.....
def test(req):
print(req.GET)
return HttpResponse('请求对象')
注意:key不要重名
- 通过路由进行传参 视图函数设置相关形参 直接打印形参可获得值
- get方法 (在url中直接设置键值对?key=value&key=value.....,通过get方法获取)
请求地址:127.0.0.1:8000?key=value&key=value.....
def test(req):
print(req.GET.get('name'))
print(req.GET.get('age'))
print(req.GET.getlist('name'))
return HttpResponse('请求对象') - getlist方法
请求地址:127.0.0.1:8000?key=value&key=value.....
def test(req):
print(req.GET.getlist('name'))
return HttpResponse('请求对象')
可以接收同名的key的值 不会发生覆盖
5、POST方法
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>注册</h1>
<form action="" method="post">
{% csrf_token %}
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="text" name="userpass"></p>
<p><input type="submit"></p>
</form>
</body>
</html>
views.py
def register(req):
if req.method == 'POST':
print(req.POST)
return HttpResponse('数据提交过来了')
return render(req, 'register.html')
五、响应对象 HttpResponse
1、概述与配置
- 概述
请求对象是由框架创建的 响应是由程序员来创建的 - 配置
from django.shortcuts import render, HttpResponse
from django.template.loader import render_to_string
from django.http import JsonResponse
2、使用
- HttpResponse 直接返回响应内容
def index(request):
print(request)
return HttpResponse('index') - render 渲染模板
参数- req 请求对象
- templates_name 模板名称
- contenxt 传递给模板数据
- status 状态码
def register(req):
if req.method == 'POST':
print(req.POST)
return HttpResponse('数据提交过来了')
return render(req, 'register.html',{'info':'后台python数据'})
- render_to_string 返回渲染后的字符串
def index(request):
# print(request)
# raise ValueError
data = render_to_string('register.html')
print(data)
return HttpResponse('index') - JsonResponse 返回json字符串(数据传输格式)
def index(req):
return JsonResponse({'name':'lucky'})
4、httpresponse属性
-
content 返回的数据
-
status_code 状态码
def test_reponse(req):
r = HttpResponse()
r. content = '测试响应属性'
r.status_code = 404
return r
5、方法
- set_cookie() 设置cookie
- delete_cookie() 删除cookie
6、重定向 HttpResponseRedirect
- 作用
服务器间的跳转 - 方法
HttpResponseRedirect
redirect(简写 推荐) - 导入
from django.http import JsonResponse, HttpResponseRedirect
from django.shortcuts import render, HttpResponse, redirect - 重定向
路由地址
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('test_reponse/', views.test_reponse, name='test_reponse'),
path('redirect_view/', views.redirect_view, name='redirect_view'),
path('args//int:age/', views.args, name='args'),
]
视图函数
def test_reponse(req):
r = HttpResponse()
r. content = '测试响应属性'
r.status_code = 404
return r
def args(req, name, age):
return HttpResponse('返回多个参数')
# 重定向视图函数
def redirect_view(req):
# return HttpResponse('测试重定向')
return HttpResponseRedirect('/test_reponse/')
return HttpResponseRedirect('/args/lucky/18/')
return redirect('/test_reponse/')
return redirect('/args/lucky/18/')
7、reverse 反向解析
- 作用
通过namespace以及path中name进行反向构造路由地址 - 导入
from django.urls import reverse - 构造路由地址
# 路由构造视图函数
def reverse_view(req):
# 构造无参路由
url = reverse("App:index")
url = reverse("App:test_reponse")
# 构造带参路由
url = reverse('App:args', kwargs={'name':'lukcy','age':18})
url = reverse('App:args', args=['lukcy',18])
return HttpResponse(url) - 组合使用
# 重定向视图函数
def redirect_view(req):
return redirect(reverse('App:args', kwargs={'name':'lukcy','age':18}))
六、会话控制COOKIE
1、概述
因为HTTP协议是无状态协议 每一次请求都是一次新的会话 所以出现了cookie和session 会话保持
会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份
2、值的存储
cookie存储在客户端 也就是浏览器上 一般会限制cookie的个数为20个 并且单个cookie的大小不能超过4kb 明文存储 不安全
3、设置cookie
-
方法
response.set_cookie() -
参数
- key cookie的键
- value cookie的值
- max_age 最长使用时间(过期时间)
- expires 过期时间 优先级高
- path 生效的路径
- secure HTTPS传输时设置为true
- httponly 是否仅为http传输
-
实例
路由
path('set_cookie/', test_cookie.set_cookie, name='set_cookie'),
path('set_cookie_lifetime/', test_cookie.set_cookie_lifetime, name='set_cookie_lifetime'),
视图
# 设置cookie
def set_cookie(req):
res = HttpResponse('设置cookie')
# 不设置过期时间 则为浏览会话结束时
res.set_cookie('name', 'lucky')
return res# 设置cookie并设置过期时间 def set_cookie_lifetime(req): res = HttpResponse('设置cookie并设置过期时间') # 设置过期时间为2分钟 res.set_cookie('name', 'lucky', max_age=120) return res -
可以设置key,{} 形式设置所有数据
4、获取cookie
- 方法
req.COOKIES - 格式
req.COOKIES.get('key') - 实例
路由
path('look_cookie/', test_cookie.look_cookie, name='look_cookie'),
视图
# 查看cookie
def look_cookie(req):
# 获取cookie 并设置默认值
res = req.COOKIES.get('name','default')
return HttpResponse(res)
5、删除cookie
- 方法
delete_cookie() - 格式
response.delete_cookie() - 实例
路由
path('delete_cookie/', test_cookie.delete_cookie, name='delete_cookie'),
视图
def delete_cookie(req):
res = HttpResponse('删除cookie')
res.delete_cookie('name')
return res
七、会话控制session
1、概述
因为HTTp协议是无状态协议 每一次请求都是一次新的会话 所以出现了cookie和session 会话保持
会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份
2、值的存储
session基于cookie
session的值存储于服务器端 数据库/内存/redis/文件中
将sessionid存储在cookie中 也就是当前数据的钥匙
3、启用session(默认开启)
settings.py
INSTALLED_APPS = [
'django.contrib.sessions',
]
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
]
session开启后 req才会有session属性
4、session配置数据库
session默认存储在数据库中
- 生成数据库表
python manage.py migrate - 数据库配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'python36django',
'HOST':'127.0.0.1',
'PORT': 3306,
'PASSWORD': '123456',
'USER':'root',
}
} - 安装pymysql
pip install pymysql - project/init.py
import pymysql
pymysql.install_as_MySQLdb()
5、设置session
- 属性
req.session[key] = value - 过期时间
req.session.set_expiry(value)- inter 整数秒
- 0 当前浏览会话结束时
- None 依赖于全局过期时间
settings.py
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
- 实例
路由
path('set_session/', test_session.set_session, name='set_session'),
path('set_session_lifetime/', test_session.set_session_lifetime, name='set_session_lifetime'),
视图
def set_session(req):
# 默认过期时间为2周
req.session['name'] = 'lucky'
req.session['age'] = '18'
return HttpResponse('设置session
def set_session_lifetime(req):
# 过期时间为0 浏览会话结束时
req.session.set_expiry(0)
# 设置session存活时间为1分钟
req.session.set_expiry(60)
req.session['name'] = 'lucky'
req.session['age'] = '18'
return HttpResponse('设置session并设置过期时间')
6、获取session
- 方法
req.session.get(key) - 实例
def get_session(req):
val = req.session.get('name', 'default')
return HttpResponse('获取session---'+val)
7、删除session
方法:
- pop() 通过key删除值
- del req.session[key] 删除指定的key
- clear() 清除当前用户的session数据
- flush() 一般用于退出 清空session表中的数据
- logout(req) 退出 清空session表中的数据
from django.contrib.auth import logout - clear_expired() 清除过期的session
实例
def delete_session(req):
req.session.pop('name')
del req.session['name']
req.session.clear()
req.session.flush()
logout(req)
req.session.clear_expired()
return HttpResponse('删除session')
8、存储位置
- 默认存储在数据库中
SESSION_ENGINE = 'django.contrib.sessions.backends.db' - 存储在文件中
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# 存储文件路径
SESSION_FILE_PATH = '/home/xlg/桌面/session_cache' - 存储在内存中
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' - 存储在内存与数据库中
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
优先查找内存中 不存在则去数据库中 - 缓存在redis中
安装
sudo pip install redis
sudo pip install django-redis-sessions==0.5.6
配置
# 更改存储在redis中
SESSION_ENGINE = 'redis_sessions.session'
# 主机
SESSION_REDIS_HOST = '127.0.0.1'
# 端口
SESSION_REDIS_PORT = '6379'
# 数据库
SESSION_REDIS_DB = 0
本文来自博客园,作者:寻月隐君,转载请注明原文链接:https://www.cnblogs.com/QiaoPengjun/articles/15947008.html

浙公网安备 33010602011771号