django视图函数解析(三)

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 定义的变量不能重新被定义
原文地址:https://www.cnblogs.com/why957/p/9185321.html