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. ZOJ - 3623 完全背包变种

    题意理解有误导致方程建歪,题意是n种类型的船造成至少L伤害的最小时间,攻击过程是不必同步的 #include<iostream> #include<algorithm> #in ...

  2. POJ - 1080 枚举 / DP

    要求max{F/P},先枚举下界lowf,再贪心求符合约束条件的n个最小价值和 记录F的离散值和去重可以大幅度常数优化 (本来想着用DP做的) (辣鸡POJ连auto都Complie Error) # ...

  3. 使用PHP并发执行任务–curl_multi应用

    使用PHP并发执行任务–curl_multi应用 原网址:http://lampblog.org/category/phpdev

  4. 转 C#对多个集合和数组的操作(合并,去重,判断)

    在开发过程中.数组和集合的处理是最让我们担心.一般会用for or foreach 来处理一些操作.这里介绍一些常用的集合跟数组的操作函数. 首先举例2个集合A,B. List<int> ...

  5. mysql - VARCHAR与VHAR的区别

    一, 基本介绍 char 和 varchar 两类型类似, 用来存储字符串,不同之处来自于他们的保存和检索的差别, char 属于固定的长度字符类型, 而varchar 属于可变长度的字符类型 值 C ...

  6. elastic 常用查询操作

    _ GET      http://127.0.0.1:9200/_cat/health?v  健康状况 GET      http://127.0.0.1:9200/_cat/indices?v  ...

  7. DB Intro - MongoDB User

    MongoDB 3.0 用户创建   摘要: MongoDB 3.0 安全权限访问控制,在添加用户上面3.0版本和之前的版本有很大的区别,这里就说明下3.0的添加用户的方法. 环境.测试: 在安装Mo ...

  8. Android ContentProvider的介绍(很详细)

    博客分类: android进阶   一.ContentProvider的概念 ContentProvider:为存储和获取数据提供统一的接口.可以在不同的应用程序之间共享数据.Android已经为常见 ...

  9. 【Java】使用Eclipse进行远程调试,Linux下开启远程调试

    原博地址:http://blog.csdn.net/dfdsggdgg/article/details/50730311 1.center下,在startup.sh文件首行中添加如下语句 declar ...

  10. ArrayList  集合

    ArrayList       集合:很多数据的一个集合       数组:长度不可变.类型单一 集合的好处:长度可以任意改变  类型随便 集合长度都的问题   很多数据的集合数组类型不可变 长度单一 ...