视图的介绍 ,HttpRequest 和 HttpResponse 的介绍使用方法

版权声明:长安白猫 https://blog.csdn.net/weixin_44074810/article/details/91045437

视图

重点
1、HttpRequest

    1. 位置参数和关键字参数
    2. 查询字符串
    3. 请求体:表单数据,JSON数据
    4. 请求头

2、HttpResponse

    1.HttpResponse
    2.JsonResponse
    3.redirect

3、类视图

    1.类视图的定义和使用

    2.类视图装饰器(难点)

一、试图介绍和项目准备

  1. 视图就是应用中views.py文件中的函数
  2. 视图的第一个参数必须为HttpResquset对象。还可能包含下参数如
    ① 通过正则表达式组获取的位置参数
    ② 通过正则表达式组获得的关键字参数

3.视图必须返回一个HttpResponse对象或子对象作为响应

① 子对象: JsonResponse HttpResponseRedirect

4.视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者

① 响应内容可以是HTML内容,404错误,重定向,json数据...
  1. 使用视图时需要进行两步操作,两步操作不分先后
    ① 配置URLconf
    ② 在应用/views.py中定义视图

二、URLconf

1. 浏览者通过在浏览器的地址栏中输入网址请求网站
2. 对于Django开发的网站,由哪一个视图进行处理请求,是由url匹配找到的
1. 项目中urls.py
    匹配成功后,包含到应用的urls.py
    url(正则, include('应用.urls'))

url(r'^',include('book.urls'))

2. 应用中urls.py
    匹配成功后,调用views.py对应的函数
    url(正则, views.函数名)

from django.conf.urls import url
from book.views import bookList(

urlpatterns = [

    # 匹配书籍列表信息的URL,调用对应的bookList视图
    url(r'^booklist/$',bookList)
]

注意:

  1. 正则部分推荐使用 r,表示字符串不转义,这样在正则
    表达式中使用 \ 只写一个就可以

  2. 不能在开始加反斜杠,推荐在结束加反斜杠
    正确:path/
    正确:path
    错误:/path
    错误:/path/

  3. 请求的url被看做是一个普通的python字符串,进行匹配时不包括域名、get或post参数

 3.1 如请求地址如下:
          http://127.0.0.1:8000/18/?a=10
 3.2 去掉域名和参数部分后,只剩下如下部分与正则匹配
          18/

说明:
虽然路由结尾带/能带来上述好处,但是却违背了HTTP中URL表示资源位置路径的设计理念。
是否结尾带/以所属公司定义风格为准。

三、路由命名与reverse反解析(逆向)

  1. 路由命名
    在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。
  1. 在使用include函数定义路由时,可以使用 namespace 参数定义路由的命名空间,如
    url(r’^’,include(‘book.urls’,namespace=‘book’))

命名空间表示,凡是book.urls中定义的路由,均属于namespace指明的book名下。
命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。

  1. 在定义普通路由时,可以使用name参数指明路由的名字,如
urlpatterns = [
    url(r'^$',index),
    # 匹配书籍列表信息的URL,调用对应的bookList视图
    url(r'^booklist/$',bookList,name='index'),
    url(r'^testproject/$',views.testproject,name='test'),
]

  1. reverse反解析

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

urlpatterns = [
    url(r'^$',index),
    # 匹配书籍列表信息的URL,调用对应的bookList视图
    url(r'^booklist/$',bookList,name='index'),
    url(r'^testproject/$',views.testproject,name='test'),
]

2 reverse反解析

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

from django.core.urlresolvers import reverse
#或者
from django.urls import reverse

def testproject(request):

    return HttpResponse("OK")

# 定义视图:提供书籍列表信息
def bookList(request):

    url = reverse('book:test')
    print(url)
    return HttpResponse('index')

    1. 对于未指明namespace的,reverse(路由name)
    2. 对于指明namespace的,reverse(命名空间namespace:路由name)

四、HttpRequest对象

1. 提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取;
2. 查询字符串(query string),形如key1=value1&key2=value2;
3. 请求体(body)中发送的数据,比如表单数据、json、xml;
4. 在http报文的头(header)中。

1 URL路径参数

  1. 如果想从URL中获取值,需要在正则表达式中使用分组,

  2. 获取值分为两种方式

     1.位置参数
          1. 参数的位置不能错
     2.关键字参数
          2. 参数的位置可以变,跟关键字保持一致即可
    

3.注意:两种参数的方式不要混合使用,在一个正则表达式中只能使用一种参数方式
4.分别使用以上两种获取URL值的方式提取出18 188
http://127.0.0.1:8000/18/188/

位置参数

1. 应用中urls.py
 url(r'^(\d+)/(\d+)/$', views.index),

2. 视图中函数: 参数的位置不能错
def index(request, value1, value2):
      # 构造上下文
      context = {'v1':value1, 'v2':value2}
      return render(request, 'Book/index.html', context)

关键字参数

1. 应用中urls.py
       ①  其中?P<value1>部分表示为这个参数定义的名称为value1
       ②  可以是其它名称,起名要做到见名知意
利用正则进行分组,起别名
    url(r'^(?P<value1>\d+)/(?P<value2>\d+)/$', views.index),

2. 视图中函数: 参数的位置可以变,跟关键字保持一致即可

def index(request, value2, value1):
      # 构造上下文
      context = {'v1':value1, 'v2':value2}
      return render(request, 'Book/index.html', context)

2 Django中的QueryDict对象

https://www.baidu.com/s?ie=utf-8&wd=itcast&rsv_pq=fdf543ed000f8688&rsv_t=8862Eb1lxc9858Ihke7VdJylicTyYs%2F3EuFyVPKcOBnv9wmTxLdhwlYL6%2F8&rqlang=cn&rsv_enter=1&rsv_sug3=5&rsv_sug1=4&rsv_sug7=100

以? 作为一个分隔
    ?前边 表示 路由
    ?后边 表示 get方式传递的参数 称之为 查询字符串
    ?key=value&key=value...

我们在登陆的时候会输入用户名和密码 理论上 用户名和密码都应该以POST方式进行传递
只是为了让大家好理解,我们接下来 用 get方式来传递用户名和密码

HttpRequest对象的属性GET、POST都是QueryDict类型的对象
与python字典不同,QueryDict (字典)类型的对象用来处理同一个键带有多个值的情况

  1. 方法get():根据键获取值

    如果一个键同时拥有多个值将获取最后一个值

    如果键不存在则返回None值,可以设置默认值进行后续处理

  2. get(‘键’,默认值)

    方法getlist():根据键获取值,可以返回多值,值以列表返回,可以获取指定键的所有值

    如果键不存在则返回空列表[],可以设置默认值进行后续处理

    getlist(‘键’,默认值)

  3. 查询字符串Query String

获取请求路径中的查询字符串参数(形如?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')

重要:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,
依然可以通过request.GET获取请求中的查询字符串数据。

4 请求体

  1. 请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,
    可以是XML字符串,应区别对待。

  2. 可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE。

  3. Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,
    在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件,

4.1 表单类型 Form Data

前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。

def post(request):
a = request.POST.get(‘a’)
b = request.POST.get(‘b’)
alist = request.POST.getlist(‘a’)
print(a)
print(b)
print(alist)
return HttpResponse(‘OK’)

4.2 非表单类型 Non-Form Data

非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,
自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。

例如要获取请求体中的如下JSON数据
{“a”: 1, “b”: 2}

可以进行如下方法操作:

import json

def post_json(request):
    json_str = request.body
    json_str = json_str.decode()  
    req_data = json.loads(json_str)
    print(req_data['a'])
    print(req_data['b'])
    return HttpResponse('OK')

    # json.damps 将字典转换成json形式的字符串
    # json.loads 将json形式的字符串转换为字典

5 请求头
可以通过 request.META 属性获取请求头headers中的数据,request.META为字典类型。

常见的请求头如:

CONTENT_LENGTH– The length of the request body (as a string).
CONTENT_TYPE– The MIME type of the request body.
HTTP_ACCEPT– Acceptable content types for the response.
HTTP_ACCEPT_ENCODING– Acceptable encodings for the response.
HTTP_ACCEPT_LANGUAGE– Acceptable languages for the response.
HTTP_HOST– The HTTP Host header sent by the client.
HTTP_REFERER– The referring page, if any.
HTTP_USER_AGENT– The client’s user-agent string.
QUERY_STRING– The query string, as a single (unparsed) string.
REMOTE_ADDR– The IP address of the client.
REMOTE_HOST– The hostname of the client.
REMOTE_USER– The user authenticated by the Web server, if any.
REQUEST_METHOD– A string such as"GET"or"POST".
SERVER_NAME– The hostname of the server.
SERVER_PORT– The port of the server (as a string).

具体使用如:

def get_headers(request):
    print(request.META['CONTENT_TYPE'])
    return HttpResponse('OK')

6 其他常用HttpRequest对象属性

method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
user:请求的用户对象。
path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。

encoding:一个字符串,表示提交的数据的编码方式。
    如果为None则表示使用浏览器的默认设置,一般为utf-8。
    这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。

FILES:一个类似于字典的对象,包含所有的上传文件。

HttpResponse对象

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

1 HttpResponse
可以使用django.http.HttpResponse来构造响应对象。

HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)

也可通过HttpResponse对象属性来设置响应体、响应体数据类型、状态码:

1. content:表示返回的内容。传递字符串  不要传递 对象,字典等数据
2. status:HTTP status code must be an integer from 100 to 599.   只能使用系统规定的 
3. status_code:返回的HTTP响应状态码。
4. content_type:是一个MIME 类型
	语法形式是:大类/小类
5.text/html, text/css   text/javascript
   image/png    image/gif    image/jpeg

响应头可以直接将HttpResponse对象当做字典进行响应头键值对的设置:

1. response = HttpResponse()
2. response['itcast'] = 'Python'  # 自定义响应头Itcast, 值为Python

示例:

from django.http import HttpResponse

def response(request):
    return HttpResponse('itcast python', status=400)
    或者
    response = HttpResponse('itcast python')
    response.status_code = 400
    response['itcast'] = 'Python'
    return response

2 HttpResponse子类

Django提供了一系列HttpResponse的子类,可以快速设置状态码

HttpResponseRedirect 301
HttpResponsePermanentRedirect 302
HttpResponseNotModified 304
HttpResponseBadRequest 400
HttpResponseNotFound 404
HttpResponseForbidden 403
HttpResponseNotAllowed 405
HttpResponseGone 410
HttpResponseServerError 500

3 JsonResponse

若要返回json数据,可以使用JsonResponse来构造响应对象,作用:

1. 帮助我们将数据转换为json字符串
2. 设置响应头Content-Type为application/json

例:

from django.http import JsonResponse

def response(request):
    return JsonResponse({'city': 'beijing', 'subject': 'python'})



实例:显示成字典
    from django.http import JsonResponse
    data = {'name':'zongwenbo'}
    
    return JsonResponse(data)

4 redirect重定向 ,跳转页面

from django.shortcuts import redirect

def response(request):
    return redirect('/get_header')

猜你喜欢

转载自blog.csdn.net/weixin_44074810/article/details/91045437
今日推荐