创建一个简单的 Django 服务并实现一个表单以通过 HttpRequester 发送 GET/POST http 请求
在调试 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 端口:
目录结构如下:
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图标,然后会出现界面:
使用方法一目了然,支持http请求的GET。 /POST/PUT/DELETE等方法。
2.1 GET 方法要求 Django 服务:
GET 只通过请求行传递参数,即通过 ? 将参数添加到 URL 末尾。和 &,因此您实际上只需将请求行复制到浏览器的地址栏中即可。 GET 请求已实施。使用HTTPRquester的GET请求结果如下:
对应Django后端控制台输出。注意,由于 GET 请求中没有有效的 body 数据,当 json 尝试解析 body 时,出现异常:
2.2 POST 方法请求 Django 服务
POST 方法请求比较困难。必须根据POST正文的具体内容设置相应的content_type。这里使用application/json和application/x-www-form-urlencoded。 content_type 提交的示例 观察无表单和表单提交的 POST 请求。
2.2.1 非正式内容提交:
对应Django服务控制台输出:
从右侧返回结果可以看到,请求体是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服务控制台输出:
可以在返回的结果Body中看到POST 包含数据。正文包含原始内容的未解析数据。由于这不是有效的 json 字符串,因此在尝试解析它时会引发异常。 POST 是一个以键值形式包含的字典。获取分析的身体数据。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。