本文介绍: 1、在views.py中,定义视图类。2、必须继承View或者View子类3、不同的请求方法有相应的方法进行对应。GET -> getPUT -> put4、每一个处理请求方法,必须得返回HttpResponse对象或者HttpResponse子类对象5、每一个处理请求方法第二个参数必须为HttpRequest对象# GET -> get 方法name‘: ‘电脑‘,return HttpResponse(f”{order_id}的post请求“)

目录

一、视图函数介绍

二、HTTPRequest对象(get请求与post请求)

2.1  url路径参数(前端向后端传递参数)

2.2  get 请求传参

2.3.1  url ?后面的key value键值对参数(查询字符串参数)

2.3.3  get其他类型请求体?

2.3 POST请求&请求体

2.3.1 POST请求 表单类型 form-data 与 x-www-form-urlencoded

2.3.2 POST请求 请求体为JSON

2.3.3  post传纯二进制文件 binary

三、请求头

3.1 request headers的写法

3.2 获取请求request headers的信息 两种方式

3.2.1  方式一:通过request.headers获取(不常用)

3.2.2  方式二:通过request.META属性获取请求头headers中的数据

四、HttpResponse

五、JsonResponse

六、视图类

6.1 定义视图类

3.2 定义视图类的路由

3.3 效果演示


一、视图函数介绍

视图就是应用views.py中定义的函数,称为视图函数

def index(request):
    return HttpResponse("hello world!")

1、视图的第一个参数必须为HttpRequest对象,还可能包含参数如通过正则表达式获取位置参数、通过正则表达式组获得的关键字参数

2、HttpRequest对象包含请求的所有数据请求头、请求体)

3、视图函数必须得返回一个HttpResponse对象或者其子类对象

对象: JsonResponse HttpResponseRedirect

4、视图负责接受Web请求HttpRequest,进行逻辑处理,返回Web响应HttpResponse给请求者
响应内容可以是HTML内容,404错误重定向json数据

二、HTTPRequest对象(get请求与post请求)

网址中问号前边表示路由,问号后面表示查询字符串

http://127.0.0.1:8000/orders/getOrders/12345?name=zhangsan&age=18

路由orders/getOrders/12345/

查询字符串参数name=zhangsan&age=18

HttpRequest对象的属性GET、POST都是QueryDict类型的对象

2.1  url路径参数前端向后端传递参数

如请求:

http://127.0.0.1:8000/orders/getOrders/12345?name=zhangsan&age=18

url中,12345 要求是一个数类型变量

url中的变量参数

url路径中传递的参数
在请求实例方法中,使用关键字参数来接收

如:

路由配置

path("getOrders/<int:order_id>/",views.OrdersView.as_view()),

视图接收变量

    def get(self,request,order_id):
        print(request)
        order_data_dic = {
            'id': order_id,
            'name': '电脑',
            'price': '500¥'
        }

变量名称在两处要保持一致。

2.2  get 请求传参

HttpRequest对象的属性GET、POST都是QueryDict类型的对象

get请求,一般情况下,只有请求头(headers),没有请求体。

2.3.1  url ?后面的key value键值对参数(查询字符串参数)

如 http://www.xxx.com/?key1=value1&amp;key2=value2

views视图函数获取传参方式使用request.GET获取

1、request.GET返回QueryDict (用户在url传参数的整个数据体),类似于python中dict类型

2、想要获取请求中的具体某个字段

可以使用[‘key1′]、get(‘key1′),会返回具体的值,如果有多个相同key键值对,获取的是最后一个

3、getlist(‘key1′),获取相同key的多个值,返回list类型

举例:

1、视图函数,获取传参

def get_demo(request):
    request_obj = request.GET
    name = request_obj["name"]
    age = request_obj.get("age")
    json_data = {
        "name":name,
        "age":age,
        "request_obj":request_obj
    }
    return JsonResponse(json_data)

2、配置路由

path('get_demo/',views.get_demo),

注意:

1、查询字符串不区分请求方式,如果客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据

2.3.3  get其他类型请求体?

2.3 POST请求&amp;请求体

HttpRequest对象的属性GET、POST都是QueryDict类型的对象。

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

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

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

#'django.middleware.csrf.CsrfViewMiddleware',

2.3.1 POST请求 表单类型 formdataxwww-form-urlencoded

1、表单介绍

表单类型,有2种,formdataxwww-form-urlencoded  

 区别

1、xwww-form-urlencoded 表单value 只能是文本的形式,value只能是字符串或者数字

可以文件视频图片等。

对应request heads中的 Content-Type 为 application/xwww-form-urlencoded

(在postman ,在xwww-form-urlencoded 表单下,写数据,postman 会在request headers自动填充 Content-Type:application/xwww-form-urlencoded)

2、formdatavalue既可以传文本,也可以传二进制数据文件视频图片等)

对应的request headers 中 Content-Type: multipart/form-data;

(在postman中 ,在form-data表单下,写数据,postman 会在request headers中自动填充 Content-Type:multipart/form-data;)

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

1、创建post 视图函数,通过request.POST属性获取传参数

def post_test1(request):
    if request.method == 'GET':
        return HttpResponse("这是一个get请求")
    elif request.method == 'POST':
        name = request.POST.get('name')
        age = request.POST.get('age')
        json_data = {
            "name": name,
            "age": age,
            "response_obj": request.POST
        }
        return JsonResponse(json_data)
    else:
        return HttpResponse("这是一个其他类型的请求")

2、配置路由

path('post_test1/',views.post_test1)

3、创建post请求,请求体为表单www-form-urlencoded

 在postman中,表单选择 www-form-urlencoded 与 form-data 好像都可以

报错处理

1、 RuntimeError: You called this URL via POST, but the URL doesn‘t end in a slash and you have APPEND_SLASH set. Django can’t redirect to the slash URL while maintaining POST data. Change your form to point to 127.0.0.1:8000/orders/post_test2/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.

客户端,在请求时,url 不是以/结尾的。必须以/结尾。

错误的urlhttp://127.0.0.1:8000/orders/post_test2

正确的url: http://127.0.0.1:8000/orders/post_test2/

form-data 文件处理

1、表单www-form-urlencoded,用户传的表单key=value,value 都是文本,在获取传参时,使用

request.POST 就可以获取

2、form-data表单,value可以传文件。如果value是正常的文件,可以通过request.POST获取。

如果value是文件,则使用request.FILES获取。

2.3.2 POST请求 请求体为JSON

请求体为JSON或者XML,都属于非表单类型 Non-Form Data。
非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析

request.body返回bytes类型。

1、创建post 视图函数,通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析

def post_test2(request):
    if request.method == 'POST':
        # request.body 为<class 'bytes'>类型的json
        request_json = request.body
        # 将 bytes/str类型的json转成字典
        request_dic = json.loads(request_json)
        # 解析字典,取数据
        name = request_dic.get("name")
        age = request_dic.get("age")
        return HttpResponse(f"我的名字是{name},今年{age}岁")
    else:
        return HttpResponse("这是一个其他类型的请求")

2、配置路由

path('post_test2/',views.post_test2),

3、创建 post 请求体为json的请求

其他:

1、json格式字符串,与字典相互转换

json.loads  将json格式字符串,转为字典

json.dumps 将字典,转成json格式字符

注意:

处理json格式的求体时,我们先将json转成了字典

# 将 bytes/str类型的json转成字典
request_dic = json.loads(request_json)

注意,json的标准格式里面的key 与value都是双引号

{
    "name": "wangwu",
    "age": "35",
    "response_obj": {
        "name": "wangwu",
        "age": "35"
    }
}

如果客户端,在做json请求体时,写的是一个不标准的json,里面用的引号为单引号

{
    'name': "wangwu",
    "age": "35",
    "response_obj": {
        "name": "wangwu",
        "age": "35"
    }
}

在将json转成字典时,

request_dic = json.loads(request_json)

转换报错。 (可以try..catch..做异常处理

2.3.3  post传纯二进制文件 binary

post body 传binary 纯的二进制文件(只传文件

 后端接收,使用request.body 去提取

三、请求头

3.1 request headers的写法

在写request headers时,可以使用-,不可以使用_

举个例子

headers的错误写法 ,my_name

正确写法my-name

 

3.2 获取请求request headers的信息 两种方式

通过request.META 或request.headers获取。

request headers 如下图

 

3.2.1  方式一:通过request.headers获取(不常用)

格式

request.headers 为字典,获取value值,可以使用request.headers[key] 或者 request.headers.get(key)

如,获取my-name

my-name的值为 request.headers[“my-name”]

3.2.2  方式二:通过request.META属性获取请求头headers中的数据

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

注意:

1、request.META 中,将-转换成了_。如将my-name转换成HTTP_MY_NAME

2、request.META 中,将key全部转换成了大写,如将Authorization 转换成 HTTP_AUTHORIZATION

3、request.META 中,在key前,加了HTTP_前缀,如将Authorization 转换成 HTTP_AUTHORIZATION

举例:

获取headers中的my-name 与Authorization的值

request.META[‘HTTP_MY_NAME’]

request.META[‘HTTP_AUTHORIZATION’]

四、HttpResponse

格式:

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

 a.第一个参数(响应体)必须为字符串类型
 b.content_type可以指定响应头中的Content-Type参数
 c.status可以指定响应状态

json_str = json.dumps(project_data, ensure_ascii=False)
return HttpResponse(f"<h1>获取项目{pk}信息</h1>")
return HttpResponse(json_str, content_type='application/json', status=201)

五、JsonResponse

HttpResponse的子类

实现功能

JsonResponse用于返回json数据(用户端接收的数据)

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

服务端在组装JsonResponse数据时,可以传入字典类型的数据,也可以传入嵌套字典的列表

样式

return JsonResponse(data, encoder=DjangoJSONEncoder, safe=True,
                 json_dumps_params=None, **kwargs):

举例: 

return JsonResponse(project_data, json_dumps_params={'ensure_ascii': False}, status=201)

1、第一个参数(data)可以直接传递字典或者嵌套字典的列表
2、默认添加content_typeapplication/json
3、默认第一个参数只能为字典,如果为嵌套字典的列表,必须设置safe=False。关掉安全模式

1、字典类型的数据:

        dict_data = {
            'id': 1,
            'name': 'xxxx项目',
            'age': '18'
        }

return JsonResponse(dict_data)

2、嵌套字典的列表:

必须设置safe=False。关掉安全模式

    dict_list = [
            {
                'id': 1,
                'name': 'xxxx项目',
                'age': '12'
            },
            {
                'id': 2,
                'name': 'yyyy项目',
                'age': '33'
            },
            {
                'id': 3,
                'name': 'zzzz项目',
                'age': '44'
            }
        ]

 return JsonResponse(project_data_list, safe=False)

六、视图类

使用视图类:

  1. 配置URLconf
  2. 应用/views.py中定义视图

6.1 定义视图类

1、在views.py中,定义视图类。

2、必须继承View或者View子类

3、不同的请求方法有相应的方法进行对应

        GET   ->   get
        POST  ->   post
        PUT   ->   put
        DELETE ->  delete
        PATCH  -> patch

 4、每一个处理请求的方法,必须得返回HttpResponse对象或者HttpResponse子类对象
 5、每一个处理请求的方法,第二个参数必须为HttpRequest对象

class OrdersView(View):

    # GET   ->   get 方法
    def get(self,request,order_id):
        order_data_dic = {
            'id': order_id,
            'name': '电脑',
            'price': '500¥'
        }
        return JsonResponse(order_data_dic)

    # POST  ->   post
    def post(self,request,order_id):
        return HttpResponse(f"{order_id}的post请求")

3.2 定义视图类的路由

样式:类视图.as_view()

path("getOrdersPost/",views.OrdersView.as_view()),
 # path("getOrders/<int:order_id>/",views.OrdersView.as_view())

具体代码如下:

1、配置路由

2、定义视图类

class OrdersView(View):

    # GET   ->   get 方法
    def get(self,request):
        print(request)
        order_data_dic = {
            'id': 1,
            'name': '电脑',
            'price': '500¥'
        }
        return JsonResponse(order_data_dic)

    # POST  ->   post
    def post(self,request):
        return HttpResponse("post请求")

其他:

在使用include函数定义路由时,可以使用namespace参数定义路由命名空间,如

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

命名空间表示,凡是book.urls中定义的路由,均属于namespace指明的book名下。
 

3.3 效果演示

postman get请求 视图类

http://127.0.0.1:8000/orders/getOrdersPost/

postman post请求 视图类

http://127.0.0.1:8000/orders/getOrdersPost/

原文地址:https://blog.csdn.net/qq_39208536/article/details/130663905

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_10489.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注