Django framework 03 / View

Django framework 03 / View

Yesterday Recap

  • HTTP protocol

超文本传输协议(应用层的,基于tcp\ip协议的)

特点:无状态,无连接(短连接)

请求消息格式:请求行\请求头部\空行\请求数据
    请求行:GET 路径 HTTP/1.1
    
响应消息格式:响应行\响应头部\空行\响应数据
    响应行: HTTP/1.1 状态码 状态描述

请求方法:get\post\put\delete\head\options\trace\connect\

get请求和post的请求的区别
    get,数据放在url上,有长度限制,一般用于获取数据
    post请求,数据放在请求数据部分,没有长度限制,一般用于提交数据

状态码:
    1xx请求被接受但是还在处理当中 
    2xx请求成功
    3xx重定向(301永久重定向和302临时重定向)
    4xx客户端错误(请求错误)
    5xx服务器错误
  • MVC and MTV

MVC模式
    M -- model数据库相关
    V -- views视图(逻辑相关)
    C -- controller url控制器(url分发器)
django -- MTV模式
    M -- model数据库相关
    T -- templates HTML相关(模板)
    V -- views视图(逻辑相关)
    + url分发器
  • django installation

安装:pip install django==1.11.9
创建项目: django-admin startproject 项目名
启动项目: python manage.py runserver 127.0.0.1:8001
创建应用: python manage.py startapp app名称
    指令创建的app需要配置
    项目的settings配置文件中,installapps的列表,添加一个app名称作为配置
    pycharm中创建完app之后,如果在想创建新的app,需要执行创建app的命令,并添加配置
  • url routing

from app01 import views
urlpatterns = [
    url(r'^index/',views.index)
    url(r'^index/(\d+)/(\d+)/',views.index),无名分组,分组数据以位置传参的方式给了视图函数
    url(r'^index/(?P<xx>\d+)/(?P<oo>\d+)/',views.index),有名分组,分组数据以关键字传参的方式给了视图函数,不在乎参数位置了,并且视图函数形参的名称要和又名分组的变量名称一样.
]


views.py
def index(request,n,m):
    return HttpResponse('xx')

Content Today

1. View

1.1 HTTPRequest objects

1.HTTPRequest对象就是咱们的视图函数的参数request
2.当一个页面被请求时,Django就会创建一个包含本次请求原信息(请求报文中的请求行、首部信息、内容主体等)的HttpRequest对象。
3.Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。

Common values ​​related requests

path_info     返回用户访问url,不包括域名
method        请求中使用的HTTP方法的字符串表示,全大写表示。
GET           包含所有HTTP  GET参数的类字典对象
POST          包含所有HTTP POST参数的类字典对象
body          请求体,byte类型 request.POST的数据就是从body里面提取到的

Attributes

    # print(request)  #<WSGIRequest: GET '/home/'>
    # # print(dir(request))
    #
    # print(request.path) #/home/  纯路径
    # print(request.path_info) #/home/  纯路径
    # print(request.get_full_path()) #/home/?a=1&b=2  全路径(不包含ip地址和端口)

    # print(request.META)  #请求头相关数据,是一个字典

    # print(request.method)  #GET

    # print(request.GET)
    
    # print(request.POST)
    # print(request.body)  能够拿到请求数据部分的数据(post,get没有)

1.2 HTTPResponse objects

HTTPResponse('字符串')
render(request,'xx.html')

redirect 重定向
#用法  redirect(路径) 
示例:redirect('/index/')


1.301和302的区别。
相同点:
    301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)
不同点:
    301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址
    302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。 SEO302好于301

2.重定向原因:
    1.网站调整(如改变网页目录结构)
    2.网页被移到一个新地址
    3.网页扩展名改变(如应用需要把.php改成.Html或.shtml)
这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点

3.临时重定向(响应状态码:302)和永久重定向(响应状态码:301)对普通用户来说是没什么区别的,它主要面向的是搜索引擎的机器人
    1.A页面临时重定向到B页面,那搜索引擎收录的就是A页面
    2.A页面永久重定向到B页面,那搜索引擎收录的就是B页面

2.FBV and CBV view (view classes and functions)

2.1 Class View CBV

views.py

from django.views import View
class LoginView(View):

    # def dispatch(self, request, *args, **kwargs):
    #     print('xx请求来啦!!!!')
    #     ret = super().dispatch(request, *args, **kwargs)
    #     print('请求处理的逻辑已经结束啦!!!')
    #     return ret
    def get(self,request):  #处理get请求直接定义get方法,不需要自己判断请求方法了,源码中用dispatch方法中使用了反射来处理的
        print('小小小小')
        return render(request,'login.html')

    def post(self,request):
        print(request.POST)
        return HttpResponse('登录成功')

urls.py routing wording

url(r'^login/', views.LoginView.as_view()),

View plus 2.2 decorator

视图函数
    def wrapper(func):
        def inner(*args, **kwargs):
            print(11111)
            ret = func(*args, **kwargs)
            print(22222)
            return ret
        return inner


    @wrapper
    def index(request):
        print('xxxxx')
        return HttpResponse('indexxxxxxxxx')

视图类
    from django.utils.decorators import method_decorator
    @method_decorator(wrapper,name='get')  # 方式3
    
    class LoginView(View):
        # @method_decorator(wrapper) #方式2
        # def dispatch(self, request, *args, **kwargs)
        #     print('xx请求来啦!!!!')
        #
        #     ret = super().dispatch(request, *args, **kwargs)
        #
        #     print('请求处理的逻辑已经结束啦!!!')
        #     return ret
        # @method_decorator(wrapper)  #方式1
        def get(self,request):
            print('小小小小')
            return render(request,'login.html')

        def post(self,request):
            print(request.POST)
            return HttpResponse('登录成功')

 方式1:
    添加在每一个函数中
 方式2:
    直接添加在dispatch里面,这样每个函数都会执行
 方式3:
    直接添加在类上,后面的name表示只给get添加装饰器
    以这种方式如果想给多个方法加装饰器,需要写多层装饰器,因为name这个参数的值必须是个字符串,并且不能同时写两个方法
    
注意:
    1.添加装饰器前必须导入from django.utils.decorators import method_decorator
    2.添加装饰器的格式必须为@method_decorator(),括号里面为装饰器的函数名
    3.给类添加是必须声明name
    

Guess you like

Origin www.cnblogs.com/liubing8/p/11595051.html