创建一个简单的 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前端网发表,如需转载,请注明页面地址。
code前端网
