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

猜你喜欢

转载自blog.csdn.net/weixin_41829272/article/details/80699338
今日推荐