HTTP请求向服务器传参方式

时间:2021-01-19 12:23:48   收藏:0   阅读:0

请求HttpRequest

提示:

回想一下,利用HTTP协议向服务器传参有几种途径?

为了演示请求和响应,我们会新建一个子应用request_response去演示相关内容

1. 提取查询字符串数据

提示:

# 注册总路由
urlpatterns = [
    # 用户模块:http://127.0.0.1:8000/users/register/
    path(‘‘, include(‘users.urls‘)),

    # 请求和响应
    path(‘‘, include(‘request_response.urls‘)),
]
# 注册子路由
urlpatterns = [
    # 测试提取查询字符串参数:http://127.0.0.1:8000/querystring/?name=zxc&age=18
    path(‘querystring/‘, views.QSParamView.as_view()),
]
class QSParamView(View):
    """测试提取查询字符串参数
    http://127.0.0.1:8000/querystring/?name=zxc&age=18
    """

    def get(self, request):
        # 获取查询字符串参数name、age
        name = request.GET.get(‘name‘, ‘小明‘)
        age = request.GET.get(‘age‘, ‘0‘)

        return http.HttpResponse(‘查询字符串参数:%s--%s‘ % (name, age))

技术图片

重要提示:

QueryDict补充:

2. 提取请求体数据

提示:

2.1 表单类型请求体数据(Form Data)

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

# 测试提取表单类型请求体数据:http://127.0.0.1:8000/formdata/
path(‘formdata/‘, views.FormDataParamView.as_view()),
class FormDataParamView(View):
    """测试提取表单类型请求体参数
    http://127.0.0.1:8000/formdata/
    """

    def post(self, request):
        # 获取表单类型请求体参数中的username、password
        username = request.POST.get(‘username‘)
        password = request.POST.get(‘password‘)

        return http.HttpResponse(‘表单类型请求体参数:%s--%s‘ % (username, password))

技术图片

重要提示:

  • request.POST只能用来获取POST表单发送的请求体数据

2.2 非表单类型请求体数据(Non-Form Data):JSON

提示:

需求:

{
    "username": "张小厨",
    "password": "123"
}

可以进行如下方法操作:

# 测试提取非表单类型请求体参数:http://127.0.0.1:8000/json/
path(‘json/‘, views.JSONParamView.as_view()),
import json

class JSONParamView(View):
    """测试提取非表单类型请求体参数
    http://127.0.0.1:8000/json/
    """

    def post(self, request):
        # 获取请求体中原始的JSON数据
        json_str = request.body
        # 使用json模块将原始的JSON数据转字典
        json_dict = json.loads(json_str)

        # 提取JSON数据中的参数
        username = json_dict.get(‘username‘)
        password = json_dict.get(‘password‘)

        return http.HttpResponse(‘非表单类型请求体参数:%s--%s‘ % (username, password))

技术图片

3. URL路径参数:提取URL路径中的特定部分数据

提示:

需求:

3.1 path()提取路径参数

实现需求1

# 测试path()提取普通路径参数:http://127.0.0.1:8000/url_param1/18/
path(‘url_param1//‘, views.URLParam1View.as_view()),
class URLParam1View(View):
    """测试path()提取普通路径参数
    http://127.0.0.1:8000/url_param1/18/
    """

    def get(self, request, age):
        """
        :param age: 路由提取的关键字参数
        """
        return http.HttpResponse(‘测试path()提取普通路径参数:%s‘ % age)

重要提示:

思考:

结论:

默认的路由转换器:

  • 位置在django.urls.converters.py
DEFAULT_CONVERTERS = {
    ‘int‘: IntConverter(), # 匹配正整数,包含0
    ‘path‘: PathConverter(), # 匹配任何非空字符串,包含了路径分隔符
    ‘slug‘: SlugConverter(), # 匹配字母、数字以及横杠、下划线组成的字符串
    ‘str‘: StringConverter(), # 匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    ‘uuid‘: UUIDConverter(), # 匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
}

实现需求2

问题:

解决方案:

实现需求2:自定义路由转换器

3.2 re_path()提取路径参数

# 测试re_path()提取路径参数:http://127.0.0.1:8000/url_param3/18500001111/
re_path(r‘^url_param3/(?P<phone_num>1[3-9]\d{9})/$‘, views.URLParam3View.as_view()),
class URLParam3View(View):
    """测试re_path()提取路径参数
    http://127.0.0.1:8000/url_param3/18500001111/
    """

    def get(self, request, phone_num):
        """
        :param phone_num: 路由提取的关键字参数
        """
        return http.HttpResponse(‘测试re_path()提取路径参数:%s‘ % phone_num)

3.3 path()和re_path()如何选择?

4. 请求头

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

常见的请求头如:

具体使用如:

class HeadersParamView(View):
    """测试提取请求头参数"""

    def get(self, request):
        # 获取请求头中文件的类型
        ret = request.META.get(‘CONTENT_TYPE‘)
        return http.HttpResponse(‘OK‘)

5. 其他常用HttpRequest对象属性

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!