1 视图views概述
1 作用: 视图接受web请求并响应web请求
2 本质: 视图就是python中的处理函数
3 响应: 一般是一个网页的HTML内容、一个重定向、错误信息页面、json格式的数据
2 django访问过程
#1用户在浏览器输入网址
www.sunck.wang/sunck/index.html
#2 django获取网址信息
网址去除ip与端口
sunck/index.html
#3 url管理器
逐个匹配url.conf
记录视图函数名
#4 视图管理器
匹配对应的视图函数
#5 models管理
根据视图函数匹配对象的数据库
将数据返回给视图函数
#6 templates模板引擎
根据models传入数据通过视图函数执行模板文件返回给浏览器
3 URL配置
(1)#配置流程
指定根级url配置文件
在settings中ROOT_URLCONF,默认生成好了
ROOT_URLCONF = 'project.urls'
urlpatterns
一个url实例列表
url对象
正则表达式
视图名称
名称
url匹配的正则注意事项
如果想从url中获取值,需要对正则加小括号
r'^admin/(\d+)/(\d+)'
匹配正则前方不需要加反斜杠/
正则前需要加r表示字符串不转义
(2)#根路由配置
项目下存在多个应用,定义本url配置需要使用include方法
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^admin/',admin.site.urls)
url(r'^myApp',include('myApp.urls')) #指定搜索myApp
]
(3)#url的反向解析
概念
如果在视图或模板中使用了硬编码的链接(类似绝对链接)
在urls配置发生改变时,动态生成链接的地址
解决思路
在使用链接时.通过url配置的名称动态生成url地址
作用: 使用url模板
#主路由urls.py中
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^admin/',admin.site.urls)
#指定搜索myApp,设置反向代理namespace = 'myApp'
url(r'^myApp',include('myApp.urls',namespace = 'myApp'))
]
#子路由urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
#反向代理设置值
url(r'^$',views.index,name='index')
]
4 视图函数
#(1)定义视图
本质:一个函数
视图参数def func(reuqest,参数1,参数2,...)
request 一个HttpResquest的实例,是浏览器生成的request对象,通过正则表达式获取的参数
位置 : 一般在views.py中定义
#(2)错误视图
404视图
在找不到网页时返回的
在templates模板下定义一个404.html
<h1>页面丢失</h1>
<h2>{{request.path}}</h2>
配置settings.py
DEBUG = False
DEBUG为True不会调用404页面
DEBUG为False会调用404页面
ALLOWED_HOSTS = ['*'] 允许主机名
500视图
在视图中出现错误的服务器代码
400视图
错误出现在客户的操作
5 HttpResquest对象
#(1)概述
服务器接受http请求名,会根据报文创建HttpResponse对象,
传递给视图 的第一个参数request
django创建的之后调用视图函数时传递给视图
#(2)属性
path
请求完整路径
method
表示请求的方式,常用get,post
encoding
表示浏览器提交到数据的编码方式
一般UTF-8
GET
类似字典的对象,包含了get请求的所有参数
POST
类似字典的对象,包含了post请求的所有参数
cookie
字典,包含所有的cookie
files
类似字典的对象,包含了所有上传的文件
session
类似字典的对象,表示当前会话
#(3)方法
is_ajax()
如果通过XMLHttpResquest发起的xhr对象,返回True(json数据)
#(4)QuertDict对象
request对象中的GET,POST都属于queryDict对象
get方法:
get() : 作用根据键值获取
只能获取一个值: www.sunckwang/abc?a=1&b=2&c=3
def get1(request):
a=request.GET.get('a')
b=request.GET.get('b')
getlist()
将键的值以列表的形式返回
获取多个值 www.sunckwang/abc?a=1&a=2&c=3 获取两个a这样就是一个集合
def get2(request):
a=request.GET.getlist('a')
a1=a[0]
a2=a[1]
post方法
csrf验证
通过表单from提交
{%csrf_token%}
csrf在前端的key为:X-CSRFtoken,到后端的时候django会自动添加HTTP_,并且最后为HTTP_X_CSRFtoken
6 HttpResponse对象
#(1)概述:作用给浏览器返回数据
HttpRequest对象由django创建,HttpResponse由程序员创建
#(2)用法
不调用模板,直接返回数据
def index(request):
return HttpResponse('sunck is good man')
调用模板 使用render
原型
render(request,templates_name,content)
作用:结合数据和模板,返回完整的页面
参数 :request ,templates模板路径 context,传递是字典数据{} data={} context=data
response = render(request,'Market/index.html',{})
#(3)属性
content
表示返回的内容类型
charset
返回编码格式
status_code
响应状态码
content-type
文本类型,输出的MIME类型
#(4)方法
init
使用页面的内容实例化HttpResponse
write(content)
以文件的形式写入
flush()
以文件的形式输出,刷新缓存区
set_cookie(key,value,max_age=Noe,exprise=None)
本地内存
浏览器缓存
delete_cookie(key)
删除cookie
cookie缓存区
def cookietest(request):
res = HttpResponse()
cookie=request.COOKIES
cookie = res.set_cookie('sunck','good')
return res #设置cookie的值为good
#(5)子类HttpResponseRedirect
功能 : 重定向,服务器跳转
from django.http import HttpResponseRedirect
def redirect1(request):
return HttpResponseRedirect('sunck/redirect2') #将页面重定向到sunck/redirect2的页面中
from django.http import HttpResponseRedirect
def redirect2(request):
return HttpResponse('我是重定向的视图') #重定向打印内容视图
from django.shortcuts import redirect
return redirect('sunck/redirect2')
#(6)子类JsonResponse
返回json数据:一般用于异步请求
__init__(self,data)
data : 字典对象
注意 : Content-type类型为application/json
7 session状态保持
#(1)概述 :http协议无状态的,每次请求都是新的请求
客户端与服务端的一次通信就是一次会话
实现状态保持,在客户端与服务端存储有关会话的数据大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁
存储方式
cookie
所有的数据都在客户端,不要存储在敏感的数据(直接以key:value显示在客户端)
session
所有的数据存储在服务端,在客户端用cookie存储一个session_id(value值存储在服务器中)
目的
在一段时间内,跟踪请求者的状态,可以实现跨页面访问请求者的数据
注意
不同的请求者之间不会共享这个数据,与请求者是一一对应的
#(2)启用session
在settings文件中默认启用session
MIDDLEWARE
INSTALLED_APPS
#(3)使用session
启用后每个HttpRequest对象都有一个session数据,就是类似字典的对象
request.session.get('属性')
get(key,default=None) 根据键获取session值
clear() : 清空所有的会话
flush() :删除当前的会话,并删除当前会话的cookie
from django.contrib.auth import logout
logout(request) #清除请求缓存 推荐使用
request.session.clear() #请求请求缓存
request.session.flush() #请求请求缓存
(4)例子登录跳转界面
#视图view.py
def main(request):
username = request.session.get('name',游客') #根据session中的key获取value
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') #获取post请求中的username,并生成session键值对
request.session['name'] = username
return redirect('sunck/main/') #重定向到/sunck/main/匹配到main主页
from django.contrib.auth import logout
def quit(request):
logout(request) #清除请求缓存
return redirect('/sunck/main/')
#子路由urls.py
urlpatterns=[
url(r'^main$',views.main)
url(r'^login/$',views.login)
url(r'^showmain/$',views.showmain)
url(r'^quit/$',views.quit)
]
#登录页面login.html
<form action='/sunck/showmain/' method='post'>
<input type='text' name = 'username'>
<input type='submit' value='登录'> #发起post请求,提交路径为sunck/showmain
</form>
#主页面main.html
<h1>欢迎:{{username}}</h1>
<a href='/sunck/login'>登录</a>
<a href='sunck/quit'>退出登录</a>
#(5)设置过期时间
set expiry(value)
request.session.set_expiry(10) 设置10s后清空session
在数据库中session表中数据不删除,只是过期
如果不设置两星期过期
整数 request.session.set_expiry(10)
0 关闭浏览器失效
None 永不过期
#(6)存储session的位置
数据库 : 默认存在数据库中
缓存 : 只存储在本地内存
数据库和缓存 : 优先从本地缓存中读取数据
request.session['data']=str(data)
客户端发起请求告诉服务器要设置session内容,可在数据库中的表中查看
response.set_cookie('set_cookie',random.randint(1000,9000))
数据库响应告诉客户端需要设置缓存内容
#(7)使用redis缓存数据session
pip install django-redis sessions
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_PASSWORD='sunck'
SESSION_REDIS_PREFIX = 'session'
8 注意事项
#(1)is判定 :判定值相等,内存地址也相等
a = 10
b = 10
a is b
Ture 常用的1-256计算机共用一个内存地址
a = 9999999
b = 9999999
a is b
False 数值较大的数类似长整型,计算机会生成新的内存地址
#(2)var与let
var 定义的变量可以重新被定义
let 定义的变量不能重新被定义