Django框架04:视图

  • 内容
  • 相关

Django视图流程总结(View)


一、认识路由

1.路由命名

1) 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如  
  from django.conf.urls import url, include
    
  url(r'^',include('book.urls',namespace='book'))
2) 在定义子应用路由时,可以使用name参数指明路由的名字,如
   from django.conf.urls import url
    
    urlpatterns = [
        url(r'^$',index),
        # 匹配书籍列表信息的URL,调用对应的bookList视图
        url(r'^booklist/$',bookList,name='index'),
        url(r'^testproject/$',views.testproject,name='test'),
    ]

2.reverse反解析

使用reverse函数,可以根据路由名称,返回具体的路径,如:

from django.urls import reverse
from django.shortcuts import redirect
    
def index(request):
    
     path = reverse('book:test')  # 动态获取路由
     print(path)
     return redirect(path)
对于未指明namespace的,reverse(路由name)
对于指明namespace的,reverse(命名空间namespace:路由name)


二、HttpRequest对象  (4种请求数据的方式)

 from django.http import HttpRequest


1.url路径参数

位置参数
- 应用中urls.py
 url(r'^(\d+)/(\d+)/$', views.index),
- 视图中函数: 参数的位置不能错    
 def index(request, value1, value2):
            # 构造上下文
            context = {'v1':value1, 'v2':value2}
            return render(request, 'Book/index.html', context)
关键字参数
- 应用中urls.py
  - 其中?P部分表示为这个参数定义的名称为value1
  - 可以是其它名称,起名要做到见名知意
   url(r'^(?P<value1>\d+)/(?P<value2>\d+)/$', views.index),
- 视图中函数: 参数的位置可以变,跟关键字保持一致即可   
 def index(request, value2, value1):
            # 构造上下文
            context = {'v1':value1, 'v2':value2}
            return render(request, 'Book/index.html', context)


2.查询字符串QueryString

获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象 
# /get/?a=1&b=2&a=3
    
    def get(request):
        a = request.GET.get('a')
        b = request.GET.get('b')
        alist = request.GET.getlist('a')
        print(a)  # 3
        print(b)  # 2
        print(alist)  # ['1', '3']
        return HttpResponse('OK')
- <QueryDict 以普通的字典形式来获取 一键多值的时候, 只能获取最后一个值
- 我们想获取一键一值的话, 需要使用 QueryDict 的get方法

- 我们想获取一键多值的话, 需要使用 QueryDict 的getlist方法


3.请求体
3.1 表单类型 Form Data
data = request.POST
print(data)
    
<QueryDict: {'username': ['xcooo'], 'password': ['xincheng520']}>
3.2  非表单类型 Non-Form Data  (JSON形式的数据)
    import json
    json_data = request.body
    # b'{\n    "username":"xcooo",\n    "password":"xincheng520"\n}'    # 返回bytes类型
    
    json_str = json_data.decode()  # json形式的字符串
    json_dict = json.loads(json_str)
    print(json_dict)           
- Json 必须是双引号
- 不要加多余的逗号

4.请求头
可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。
具体使用如:
 def get_headers(request):
        print(request.META['CONTENT_TYPE'])
        return HttpResponse('OK')


5.其他HttpRequest对象属性

- method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
- user:请求的用户对象。
- path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
- encoding:一个字符串,表示提交的数据的编码方式。
  - 如果为None则表示使用浏览器的默认设置,一般为utf-8。
  - 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
- FILES:一个类似于字典的对象,包含所有的上传文件。

  


三、HttpResponse对象 (返回响应)

 from django.http import HttpResponse

视图接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。


1.HttpResponse

可以使用django.http.HttpResponse来构造响应对象。
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
    
    content       传递字符串  不要传递 对象, 字典等数据
    status        HTTP status code must be an integer from 100 to 599.  只能使用系统规定的
    content_type  是一个MIME类型
                  语法形式是:   大类/小类
                                      application/json

2.JsonResponse

   from django.http import JsonResponse
    
        data = {'name': 'xcooo'}
        return JsonResponse(data)
- 帮助我们将数据转换为json字符串
- 设置响应头Content-Type为application/json

3.redirect重定向
    from django.shortcuts import redirect
    
    def response(request):
        return redirect('http://www.baidu.com')


四、类视图

思考:一个视图,是否可以处理两种逻辑?比如get和post请求逻辑。

    类视图  是采用面向对象的思想
            1.定义类视图 
                1. 继承自 view (from django.views.generic import View)
                2. 不同的请求方式,有不同的业务逻辑
                    类视图的方法:  就直接采用http的请求名字, 作为我们的函数名 例如: get, post, put, delete
                3. 类视图的方法的第二个参数, 必须是请求实例对象
                    类视图的方法, 必须有返回值, 返回值是HttpResponse及其子类
                    
            2. 类视图的url引导 as_view()


1.使用类视图可以将视图对应的不同请求方式以类中的不同方法来区别定义。如下所示
    from django.views.generic import View
    
    class RegisterView(View):
        """类视图:处理注册"""
    
        def get(self, request):
            """处理GET请求,返回注册页面"""
            return render(request, 'register.html')
    
        def post(self, request):
            """处理POST请求,实现注册逻辑"""
            return HttpResponse('这里实现注册逻辑')
2.配置路由时,使用类视图的as_view()方法来添加。
    urlpatterns = [
        # 视图函数:注册
        # url(r'^register/$', views.register, name='register'),
        # 类视图:注册
        url(r'^register/$', views.RegisterView.as_view(), name='register'),
    ]


五、中间件

- 中间件的作用:  每次请求和响应的时候都会被调用
- 中间件的使用:  我们可以判断每次请求中是否携带了cookie的某些信息

- 中间件的定义方法

 def simple_middleware(get_response):
          
          # 这里是中间件第一次执行的地方
          # print('init111')
      
          def middleware(request):
              # 这里是 请求前
              print('before request 111111111')
              response = get_response(request)
              # 这里是 响应后
              print('after response 222222222')
              return response
      
          return middleware
- 多个中间件的执行顺序
  - 在请求视图被处理前,中间件由上至下依次执行

  - 在请求视图被处理后,中间件由下至上依次执行

 before request 111111111  被调用
 before request 111111111  被调用
 after response 222222222  被调用
 after response 222222222  被调用
您阅读这篇文章共花了: 

本文标签:

版权声明:转载请带上版权原创为《辛诚

解压密码:若设有密码均为:www.xcooo.cn

收录状态:百度未收录

Django框架04:视图

发表评论

您可以选择匿名评论,保护个人隐私 !