Code前端首页关于Code前端联系我们

创建一个简单的 Django 服务并实现一个表单以通过 HttpRequester 发送 GET/POST http 请求

terry 2年前 (2023-09-24) 阅读数 70 #后端开发

在调试 Django 中编写的服务时,您需要模拟发送 POST 请求的客户端。不过浏览器只能模拟简单的GET请求(将参数写在url中),我在网上搜了一下,找到了firefox HttpRequester插件,完美实现了模拟POST提交表单的需要。这里记录一个简单的Django服务的搭建以及使用HttpRequester进行GET/POST请求操作的过程。 ? pip install django 安装:

django-admin startproject testsite
cd testsite/
python manage.py runserver

默认服务监听 8000 端口:

搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单

目录结构如下:

testsite:
  db.sqlite3  manage.py  r
  testsite:
    __init__.py  settings.py  urls.py  wsgi.py

1.2 添加自己的模块

手动添加一个子模块和一个假子模块,创建urls.py以及其中的views.py(同时添加一个空的__init__.py文件,以便python将对应的文件夹识别为模块并允许调用),实现外部调用的http接口和内部的http请求参数写入并返回:

文件:testsite/testsite/faketest/urls.py
#!/usr/bin/env python
# coding=utf-8
from django.conf.urls import url
import views
 
 
urlpatterns = [
        url(r'^fake_query/$', views.fake_query),
    ]

文件: testsite/testsite/faketest/views.py
#!/usr/bin/env python
# coding=utf-8
import json
import requests
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpRequest, HttpResponse


# 默认开启了csrf保护机制,本服务仅作自测使用,加上csrf_exempt去除掉csrf保护
@csrf_exempt
def fake_query(request):
    print('get into fake_query')
    dct = {
            'fake': 'test',
            'GET': request.GET,
            'POST': request.POST,
            'body': request.body,
            }
    try:
        dct['json_parsed_body'] = json.loads(request.body)
    except Exception as e:
        print('json loads except:{}'.format(e))
    return HttpResponse(HttpResponse(json.dumps(dct)), content_type='application/json')

在 testsite/testsite/urls.py 中引入一个新的 faketest 模块。

文件: testsite/testsite/urls.py
from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^faketest/', include('testsite.faketest.urls')),
]

目前目录结构如下:

testsite:
  db.sqlite3  manage.py  r
  testsite:
    __init__.py  settings.py  urls.py  wsgi.py
    faketest:
        __init__.py  urls.py  views.py

2. 使用HttpRequester进行GET/POST请求

在firefox扩展商店中(https://addons.mozilla.org/zh-CN/firefox /addon/ httprequester /)添加插件后(FireFox57及以上版本不再兼容此插件,所以最新版本的firefox无法使用),点击右上角的HttpRequester图标,然后会出现界面:

搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单

使用方法一目了然,支持http请求的GET。 /POST/PUT/DELETE等方法。

2.1 GET 方法要求 Django 服务:

GET 只通过请求行传递参数,即通过 ? 将参数添加到 URL 末尾。和 &,因此您实际上只需将请求行复制到浏览器的地址栏中即可。 GET 请求已实施。使用HTTPRquester的GET请求结果如下:

搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单

对应Django后端控制台输出。注意,由于 GET 请求中没有有效的 body 数据,当 json 尝试解析 body 时,出现异常:

搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单

2.2 POST 方法请求 Django 服务

POST 方法请求比较困难。必须根据POST正文的具体内容设置相应的content_type。这里使用application/json和application/x-www-form-urlencoded。 content_type 提交的示例 观察无表单和表单提交的 POST 请求。

2.2.1 非正式内容提交:

搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单

对应Django服务控制台输出:

搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单

从右侧返回结果可以看到,请求体是POST请求的内容,位于service 解析后,再次返回json,插入到service返回的json字符串中。同时,由于这次的body是一个可以正常解析的json字符串,所以服务器不会抛出异常,而是解析这个json字符串,然后返回给调用者。

您可能会注意到,当服务收到 POST 请求时,其 request.POST 对象是一个空字典,不包含任何 POST 请求内容。这是为什么?

这包括根据 Django 官方文档的 Django 框架的具体实现:HttpRequest.POST 一个类似字典的对象,包含所有给定的 HTTP POST 参数, 。包含表单数据。请参阅下面的 QueryDict 文档。而不是属性。

请求可以通过带有空字典的 POST POST – 例如,如果使用 POST HTTP 方法请求表单但不包含表单数据。因此,你不应该使用if request.POST来控制POST方法的使用;而是使用 if request.method == "POST"(参见 HttpRequest.method

❙❙❙ no❙‸‸包含文件上传信息。请参阅 D 中的FILES.

request.POST 对象用于 jango 实现中,它用于存储包含表单数据的对象,而 request.body 包含原始(原始)内容。非正式数据,接下来我们通过POST传递表单数据来进一步验证这个

2.2.2 POST请求发送表单数据

搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单

对应的Django服务控制台输出:

搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单

可以在返回的结果Body中看到POST 包含数据。正文包含原始内容的未解析数据。由于这不是有效的 json 字符串,因此在尝试解析它时会引发异常。 POST 是一个以键值形式包含的字典。获取分析的身体数据。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门