文章目录[隐藏]
视图
概述
- 作用:
- 视图接受web请求,并响应Web请求
- 本质:
- 视图就是 一个Python中的函数
- 响应内容:
- 网页
- 重定向
- 错误视图
- 404:url找不到
- 500: 服务器内部错误
- JSON数据
- 网页
URL 配置
配置流程
- 在
settings.py
中指定根级URL配置文件:ROOT_URLCONF = 'project.urls'
,默认实现了。 urlpatterns
:- 一个url实例的对象
- url对象
- 正则表达式
- 视图名称
- 名称(用来反向解析的)
- url匹配正则的注意事项:
- 如果想要从url中获取一个值,需要对正则加小括号
- 匹配正确,前方不需要加小斜杠
/
,一般在最后加 - 正则前需要加
r
表示字符串不转义
引入其它url配置
- 一般在应用中创建
urls.py
文件,定义本应用的url配置,在工程urls.py
文件中使用include()
方法:url(r'^', include('myApp.urls',namespace='myApp')),
匹配过程
- 工程url->应用url->视图
URL的反向解析(代理):
- 概述
- 如果在视图/模板中使用了硬编码的连接,在url配置发生改变时,动态生成链接的地址。
- 解决思路
- 在使用链接时,通过url配置的名称,动态生成url地址。
- 作用
- 使用url模板的时候
视图函数
定义视图:
- 本质:一个函数
- 视图参数:
request
一个HttpRequest的实例- 通过url正则表达式获取的参数
- 位置:
- 一般在
views.py
中定义
- 一般在
错误视图
- 404视图
- 找不到网页(url匹配不成功)时返回。
- 可以自己定义。
- 在
templates
下定义404.html
request_path
:导致出错的网址。
- 配置
settings.py
DEBUG
如果为True
永远不会调用404.html页面ALLOWED_HOSTS = [*]
- 在
- 500视图
- 在视图代码中出现错误(服务器代码)。
- 400视图
- 错误是客户的操作。
HttpRequest对象
概念
- 接收HTTP请求后,会根据报文创建
HttpRequest
对象 - 视图的第一个参数就是
HttpRequest
对象 - Djano对象创建的,之后调用试图传递给视图
属性
path
- 请求的完整路径(不包括域名和端口)
method
- 表示请求的方式,常用的有GET、POST
encoding
- 表示浏览器提交的数据的编码方式,一般为
utf-8
- 表示浏览器提交的数据的编码方式,一般为
GET
- 类似字典的对象,包含了get请求的所有参数
POST
- 类似字典的对象,包含了post请求的所有参数
FILES
- 类似字典的对象,包含了所有上传的文件。
COOKIES
- 字典,包含所有的cookie
session
- 类似字典的对象,表示当前会话
方法
is_ajax()
- 如果是
XMLHttpRequest
发起的,返回True
- 如果是
QueryDict对象
- request对象中的GET、POST对象都属于QueryDict对象
- 方法
get()
- 作用:根据键获取值
- 只能获取一个值
www.baidu.com/abc?a=1&b=2&c=3
getlist()
- 将键的值以列表形式返回
- 可以获取多个值
www.baidu.com/abc?a=1&a=2&c=3
(注意有两个a)
GET属性
# 获取get传递的数据
def get1(request):
a = request.GET.get("a")
b = request.GET["b"]
c = request.GET.get("c")
return HttpResponse(a + " " + b + " " + c)
def get2(request):
a = request.GET.getlist('a')
a1 = a[0]
a2 = a[1]
b = request.GET.get('c')
return HttpResponse(a1 + " " + a2 + " " + b)
POST属性
- 使用表单模拟提交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',
]
- test case
def showregister(request):
name = request.POST.get("username")
gender = request.POST.get("gender")
age = request.POST.get("age")
hobby = request.POST.getlist("hobby") # checkbox
info = str("name:\t" + name + "\tgender:" +gender + "\tage:" + age + "\thobby"+ str(hobby))
print(info)
return HttpResponse(info)
HttpResponse对象
概述
- 作用
- 给浏览器返回数据的
HttpRequest
对象是由Django创建的,HttpResponse
对象由程序员创建。
用法
- 不调用模板,直接返回数据
return HttpResponse(info)
- 调用模板
render()
返回方法- 原型:
render(request,templateName[,context])
- 作用:结合数据和模板,返回完整的HTML页面
- 参数:
- request:请求体对象
- templateName:模板路径
- context:需要渲染在模板上的数据
- 原型:
- 属性:
content
: 返回内容charset
: 编码格式statuse_code
:响应状态- 200
- 304
- 404
content-type
:指定输出的MIME类型 #later
- 方法
init
使用页面内容实例化HttpResponse对象write(content)
以文件的形式写入flush
: 以文件的形式输出缓冲区(刷新)set_cookie(key,value="",max_age=None,exprise=None)
delete_cookie(key)
- 删除cookie
- 如果删除一个不存在的key,就当什么都没发生。
- 子类
HttpResponseRedirect
- 功能
- 重定向,服务器跳转
- 简写
redirect(to)
to
推荐使用反向解析
- 功能
- 子类`JSonResponse
- 返回json数据,一般用于异步请求。(Ajax)
__ini__(self,data)
data
是一个字典- 注意:
- Content-type类型为:applicaiton/json
-
test case
def stupage(request,page):
# 0 - 5 , 5 - 10
page = int(page)
studentsList = Students.stuObj2.all()[(page-1)*5:page*5]
return render(request, 'myApp/students.html', {'students': studentsList})
def cookieset(request):
res = HttpResponse()
# res.write("setcookies")
cookie = res.set_cookie("name", "emperinter") #设置
return res
def getcookie(request):
res = HttpResponse()
cookie = request.COOKIES
res.write("<h1>" + cookie["name"] + "</h1>")
return res
from django.shortcuts import redirect
from django.http import HttpResponseRedirect
# 重定向
def redirect1(request):
# return HttpResponseRedirect("/redirect2/")
return redirect("/redirect2/")
def redirect2(request):
return HttpResponse("我是重定向后的视图")
SESSION状态保持
概述
- HTTP协议是无状态的,每次请求都是一次新的请求,不记得以前的请求;
- 客户端与服务器端的一次通信就是一次会话;
- 想实现状态保持,需要在客户端或服务器端存储有关会话的数据
- 存储方式
- cookie
- 所有的数据都在客户端,不要存储敏感的数据
- 不安全/数据量小
- session
- 所有的数据在服务器端,在客户端用cookie存储session_id
- cookie
- 状态保持目的
- 在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据。
- 注意
- 不同的请求者之间不会共享这个数据,与请求者是一一对应的。
启用SESSION
- 在
settings.py
中启动,默认是启用的
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions', # session配置
'django.contrib.messages',
'django.contrib.staticfiles',
'myApp',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', # session配置
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
使用SESSION
- 启用session后,每个HttpRequest对象都有一个session属性,就是一个类似字段的对象;
- 方法
get(key,default=None)
根据键获取session值clear()
清空所有的会话flush()
删除当前的会话并删除会话的cookie- 设置过期时间
set_expiry(value)
- 如果不设置,默认两个星期后过期
- value
- 整数,单位为秒
- 时间对象
- 0 :关闭浏览器时失效
- None :永不过期
- 使用redis存储缓存
- 安装
pip install django-redis-sessions
- 在
seetings.py
中配置
- 安装
SESSION_ENGINE = 'redis_sessions.session'
SESSION_CACHE_ALIAS = 'default'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = None
SESSION_REDIS_PREFIX = 'session'
def main(request):
username = request.session.get("username","游客") # 获取session,后面是默认值
return render(request, 'myApp/main.html', {"username":username})
def login(request):
return render(request, 'myApp/login.html')
def showmain(request):
username = request.POST.get("username")
password = request.POST.get("password")
# save in session
request.session["username"] = username
request.session.set_expiry(10) # 设置session过期时间
return redirect("/main/")
from django.contrib.auth import logout
def quit(request):
logout(request) # 清除当前登录,推荐使用
# del session
# del request.session["username"]
# request.session.flush() # 清除所有session
# request.session.clear() # 清除所有session
return redirect("/main/")