视图
概述
- 作用
- 视图接受web请求,并响应web请求
- 本质
- 视图就是一个python中的函数
- 响应
- 网页
- 重定向
- 错误视图404 ,500 ,400
- JSON数据
url配置
- 配置流程
- 制定根级url配置文件
- settings.py文件中的ROOT_URLCONF
- ROOT_URLCONF = 'project.urls'
- 默认实现了
- 制定根级url配置文件
- urlpatterns
- 一个url实例的列表
- url对象
- 正则表达式
- 视图名称
- 名称
- url匹配正则的注意事项 - 如果想要从url中获取一个值,需要对正则加小括号 - 匹配正则前方不需要加反斜杠 - 正则前需要加r表示字符串不转义
- 配置
- 在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py文件中使用include()方法 -工程urls.py文件
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('myApp.urls', namespace="myApp"))
]
应用中urls.py文件
from django.conf.urls
import url from . import views
urlpatterns = [
url(r'^$', views.index, name="index"),
]
- URL的反向解析
- 概述
- 如果在视图、模板中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址
- 解决
- 在使用链接时,通过url配置的名称,动态生成url地址
- 作用
- 使用url模板
- 概述
视图函数
- 定义视图
- 本质:一个函数
- 视图参数
- 一个HttpRequest的实例
- 通过正则表达式获取的参数 -位置
- 一般在views.py文件下定义
- 错误视图
- 500视图在视图代码中出现错误(服务器代码)
- 400视图 错误出现在客户的操作
- 404视图
- 配置settings.py
- DEBUG如果为True永远不会调用404.html页面
- ALLOWED_HOSTS = ['*']
- 找不到网页(url匹配不成功)时返回
- 在templates目录下定义404.html
- 配置settings.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404页面</title>
</head>
<body>
<h1>页面丢失</h1>
<h2>{{request_path}}</h2>
</body> </html>
request_path导致错误的网址
- HttpRequest对象
- 概述
- 服务器接收http请求后,会根据报文创建HttpRequest对象
- 视图的第一个参数就是HttpRequest对象
- django创建的,之后调用试图时传递给视图
- 属性
- 概述
属性 | 含义 |
---|---|
path | 请求的完整路径(不包括域名和端口) |
encoding | 表示浏览器提交的数据的编码方式一般为utf-8 |
GET | 类似字典的对象,包含了get请求的所有参数 |
POST | 类似字典的对象,包含了post请求的所有参数 |
FILES | 类似字典的对象,包含了所有上传的文件 |
COOKIES | 字典,包含所有的cookie |
session | 类似字典的对象,表示当前会话 |
- 方法
- is_ajax()
- 如果是通过XMLHttpRequest发起的,返回True
- is_ajax()
- QueryDict对象
- request对象中的GET、POST都属于QueryDict对象
- 方法
- get()
- 作用:根据键获取值
- 只能获取一个值
- www.sunck.wang/abc?a=1&b=2&c=3
- getlist()
- 将键的值以列表的形式返回
- 可以获取多个值
- www.sunck.wang/abc?a=1&a=2&c=3
- get()
- GET属性
- 获取浏览器传递过来给服务器的数据
def get1(request):
a = request.GET.get('a')
b = request.GET['b']
c = request.GET.get('c')
return HttpResponse(a + " " + b + " " + c)
http://127.0.0.1:8000/app/get1?a=1&a=2&c=3
def get2(request):
a = request.GET.getlist('a')
a1 = a[0]
a2 = a[1]
c = request.GET.get('c')
return HttpResponse(a1 + " " + a2 + " " + c)
- POST属性
- 使用表单提交实现post请求
def showregist(request):
return render(request, 'myApp/regist.html')
def regist(request):
name = request.POST.get("name")
gender = request.POST.get("gender")
age = request.POST.get("age")
hobby = request.POST.getlist("hobby")
return HttpResponse("post")
- 关闭csrf
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',
]
- HttpResponse对象
- 概述
- 给浏览器返回数据,HttpRequest对象是由django创建的,HttpResponse对象由程序员创建
- 返回用法
- 不调用模板,直接返回数据
- 概述
状态保持
- 概述
- http协议时无状态的,每次请求都是一次新的请求,不记得以前的请求
- 客户端与服务器端的一次通信就是一次会话
- 实现状态保持,在客户端或者服务端存储有关会话的数据
- 存储方式
- cookie 所有的数据存储在客户端,不要存敏感的数据
- session所有的数存储在服务端,在客户端用cookie存储session_id
- 状态保持的目的
- 在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据
- 注意
- 不同的请求者之间不会共享这个数据,与请求者一一对应的 6.2 启用session settings文件中
- INSTALLED_APPS
- 'django.contrib.sessions',
- MIDDLEWARE
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 使用session
- 启用session后,每个HttpRequest对象都有一个session属性,就是一个类似字典的对象
- get(key, default=None)根据键获取session值
- clear()清空所有的会话
- flush() 删除当前的会话并删除会话的cookie
- 设置过期时间
- set_expiry(value)
- 如果不设置,两个星期后过期
- request.session.set_expiry(10)
- 0关闭浏览器时失效
- None永不过期
- 存储session的位置默认存储在数据库中SESSION_ENGINE = 'django.contrib.session.backends.db'
- 缓存只存储在本地内存中,如果丢失不能找回,比数据库快
- SESSION_ENGINE = 'django.contrib.session.backends.cache'
- 数据库和缓存优先从本地缓存中读取,读取不到再去数据库中获取
- SESSION_ENGINE = 'django.contrib.session.backends.cached_db' 6.6 使用redis缓存session
pip install django-redis-sessions
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = 'sunck'
SESSION_REDIS_PREFIX = 'session'