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 定义的变量不能重新被定义

django视图函数解析(三)的更多相关文章

  1. django视图函数及快捷方式

    视图函数,简称视图,本质上是一个简单的Python函数,它接受Web请求并且返回Web响应. 响应的内容可以是HTML网页.重定向.404错误,XML文档或图像等任何东西.但是,无论视图本身是个什么处 ...

  2. Django视图函数

    一.视图函数 1. 视图函数的第一个参数一定是一个HTTPRequest类型的对象,这个对象是Django自动创建的,具体形参名通常用request.通过这个对象,可以调用请求的一些参数,比如requ ...

  3. 【6】Django视图函数

    治大国若烹小鲜.以道莅天下 --老子<道德经> 本节内容 Django web项目的运行流程分析 视图处理函数的定义 多视图处理函数及接收参数 1. web项目运行流程分析 通常情况下,完 ...

  4. Django视图函数之三种响应模式

    视图函数响应处理: from django.shortcuts import render,HttpResponse,redirect (1)render 处理模板文件,可以渲染模板,第一个参数必须为 ...

  5. Django视图函数函数之视图装饰器

    FBV模式装饰器: 普通函数的装饰器(语法糖@) views.py from django.shortcuts import render def wrapper(f): def inner(*arg ...

  6. Django视图函数之FBV与CBV模式

    FBV模式: FBV(function base views) 就是在视图里使用函数处理请求. 一般直接用函数写的都属于是FBV模式. veiws.py from django.shortcuts i ...

  7. Django视图函数之request请求与response响应对象

    官方文档: https://docs.djangoproject.com/en/1.11/ref/request-response/ 视图中的request请求对象: 当请求页面时,Django创建一 ...

  8. Django视图函数:CBV与FBV (ps:补充装饰器)

    CBV 基于类的视图  FBV 基于函数的视图 CBV: 1 项目目录下: 2 urlpatterns = [ 3 path('login1/',views.Login.as_view()) #.as ...

  9. django视图函数中 应用装饰器

    from django.shortcuts import render, redirect, HttpResponse from .forms import LoginForm, Registrati ...

随机推荐

  1. MBR为什么不支持3T硬盘

    MBR,全称为Master Boot Record,即硬盘的主引导记录.(是管理硬盘分区的一种模式.升级版是GPT) MBR保存在硬盘的第1个扇区(即硬盘的0柱面.0磁头.1扇区).它由三个部分组成, ...

  2. 前后端分离和restful开发规范

    一.web开发的两种模式 1.前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高. 这种应用模式比 ...

  3. linux运维基础之跟我一起学正则表达式(一)

    正则表达式 ### 二, 1) 什么是正则表达式 正则表达式又称为规则表达式 正则表达式是一个计算机的一个概念 正则表达式为了处理大量的文本|字符串而定义的一套规则和方法,通常被用来检索,替换那些符合 ...

  4. Maven---pom.xml 详解(转)

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. VMware虚拟机上安装xp操作系统

    前提:安装好虚拟机 资料:windows xp 的虚拟机操作系统 上面这个文件最好保存好一份,防止以后虚拟机用坏了可以重新安装. 1 新建目录D:\virtual machine\vSQL\vm将我们 ...

  6. net.sf.json.JSONException: There is a cycle in the hierarchy! 转json死循环问题解决

    解决上述问题遵照两个原则就可以: 1.页面不需要展示关联数据时 解决:将关联对象属性排除掉 2.页面需要展示关联数据时 解决:将关联对象改为立即加载,并且将关联对象中的属性排除

  7. 案例45-crm练习改写客户列表使用struts2&OGNL

    1 修改CustomerAction代码 2 修改jsp/customer/list.jsp代码 <%@ page language="java" contentType=& ...

  8. vim配置clojure开发环境备忘录

    1 需要使用的插件 vundle 使用教程 http://www.cnblogs.com/respawn/archive/2012/08/21/2649483.html vim-fireplace h ...

  9. Jersey统一异常处理

    众所周知,java服务提供者提供给服务请求者应该是特定格式的数据,而不能出现异常栈类似信息,那么jersey中,如何添加统一的异常处理呢? 针对jersey启动如果是实现了ResourceConfig ...

  10. nyoj 600——花儿朵朵——【离散化、线段树插线问点】

    花儿朵朵 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 春天到了,花儿朵朵盛开,hrdv是一座大花园的主人,在他的花园里种着许多种鲜花,每当这个时候,就会有一大群游 ...