搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单
調(diào)試Django框架寫的服務(wù)時(shí),需要模擬客戶端發(fā)送POST請(qǐng)求,然而瀏覽器只能模擬簡(jiǎn)單的GET請(qǐng)求(將參數(shù)寫在url內(nèi)),網(wǎng)上搜索得到了HttpRequester這一firefox插件,完美的實(shí)現(xiàn)了模擬POST提交表單的需求,這里記錄一下簡(jiǎn)單Django服務(wù)的搭建、以及使用HttpRequester對(duì)應(yīng)進(jìn)行GET/POST請(qǐng)求操作的流程。
1,搭建Django服務(wù)
1.1 搭建簡(jiǎn)單服務(wù)
搭建一個(gè)簡(jiǎn)單的Django服務(wù)很容易,只需要一行命令即可創(chuàng)建一個(gè)可運(yùn)行的Django服務(wù),若未安裝Django,則需要先執(zhí)行pip install django安裝:
django-admin startproject testsite cd testsite/ python manage.py runserver服務(wù)默認(rèn)監(jiān)聽8000端口:
此時(shí)的目錄結(jié)構(gòu)如下:
testsite:db.sqlite3 manage.py rtestsite:__init__.py settings.py urls.py wsgi.py1.2 增加自定義模塊
我們手動(dòng)添加一個(gè)子模塊faketest,在其中創(chuàng)建一個(gè)urls.py和views.py(還要添加一個(gè)空的__init__.py文件,這樣python才會(huì)將對(duì)應(yīng)的文件夾識(shí)別為一個(gè)模塊,允許對(duì)其進(jìn)行調(diào)用),實(shí)現(xiàn)一個(gè)http接口供外部調(diào)用,在接口內(nèi)部對(duì)http請(qǐng)求的參數(shù)進(jìn)行輸出并返回:
文件:testsite/testsite/faketest/urls.py #!/usr/bin/env python # coding=utf-8 from django.conf.urls import url import viewsurlpatterns = [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# 默認(rèn)開啟了csrf保護(hù)機(jī)制,本服務(wù)僅作自測(cè)使用,加上csrf_exempt去除掉csrf保護(hù) @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 adminurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^faketest/', include('testsite.faketest.urls')), ]此時(shí)的目錄結(jié)構(gòu)如下:
testsite:db.sqlite3 manage.py rtestsite:__init__.py settings.py urls.py wsgi.pyfaketest:__init__.py urls.py views.py
?2,使用HttpRequester進(jìn)行GET/POST請(qǐng)求
在firefox的擴(kuò)展商店(https://addons.mozilla.org/zh-CN/firefox/addon/httprequester/)添加該插件后(FireFox57及以上版本不再兼容此插件,因此不能使用最新版firefox,),點(diǎn)擊右上角HttpRequester的圖標(biāo),將彈出如下界面:
使用方法一目了然,支持http請(qǐng)求的GET/POST/PUT/DELETE等多種methods。
2.1 GET方法請(qǐng)求Django服務(wù):
GET由于僅通過請(qǐng)求行傳遞參數(shù),即將參數(shù)通過?和&符號(hào)添加到url后面,所以其實(shí)簡(jiǎn)單的將請(qǐng)求行復(fù)制到瀏覽器地址欄,就可以實(shí)現(xiàn)GET請(qǐng)求了,以下為用HTTPRquester進(jìn)行GET請(qǐng)求的結(jié)果:
對(duì)應(yīng)Django服務(wù)后臺(tái)的控制臺(tái)輸出,注意由于GET請(qǐng)求里面沒有有效的body數(shù)據(jù),json試圖對(duì)body進(jìn)行解析時(shí),拋出了一個(gè)異常:
?2.2 POST方法請(qǐng)求Django服務(wù)
POST方法請(qǐng)求要麻煩一些,根據(jù)POST body的具體內(nèi)容要設(shè)置好對(duì)應(yīng)的content_type,這里以application/json和application/x-www-form-urlencoded兩種content_type的提交舉例觀察非表單和表單提交的POST請(qǐng)求。
2.2.1非表單內(nèi)容提交:
?對(duì)應(yīng)的Django服務(wù)控制臺(tái)輸出:
?
可以從右邊的返回結(jié)果里面看到,request的body成員就是POST請(qǐng)求時(shí)的contetn內(nèi)容,并且在服務(wù)中經(jīng)過json解析后,又再次返回放入服務(wù)返回的json串之中了,同時(shí)這次由于body中是可以正常解析的json串,所以服務(wù)端并沒有拋異常,而是將json串解析后又返回給了調(diào)用方。
可以注意到,服務(wù)收到POST請(qǐng)求時(shí),其request.POST對(duì)象卻是一個(gè)空字典,并沒有任何POST請(qǐng)求里面的content內(nèi)容,這是為什么呢?
這涉及到Django框架的具體實(shí)現(xiàn),根據(jù)Django的官方文檔:
HttpRequest.POST?A dictionary-like object containing all given HTTP POST parameters, providing that the request contains form data. See the QueryDict documentation below. If you need to access raw or non-form data posted in the request, access this through the HttpRequest.body attribute instead.
It’s possible that a request can come in via POST with an empty POST dictionary – if, say, a form is requested via the POST HTTP method but does not include form data. Therefore, you shouldn’t use if request.POST to check for use of the POST method; instead, use if request.method == "POST" (see HttpRequest.method).
POST does not include file-upload information. See FILES.
在Django的實(shí)現(xiàn)中,request.POST對(duì)象是用于存儲(chǔ)包含表單數(shù)據(jù)的對(duì)象,而在request.body中則包含了content中的原始(raw)非表單數(shù)據(jù),接下來我們通過POST傳遞表單數(shù)據(jù)來進(jìn)一步驗(yàn)證這一點(diǎn)。
2.2.2 POST請(qǐng)求提交表單數(shù)據(jù)
對(duì)應(yīng)的Django服務(wù)控制臺(tái)輸出:
可以看到,在返回結(jié)果中body和POST都有了數(shù)據(jù),body包含的是未經(jīng)解析的原始content數(shù)據(jù),由于不是一個(gè)有效json串,在試圖解析時(shí)還拋了異常,而POST則是一個(gè)字典,以key-value的形式包含了解析了的body數(shù)據(jù)。
轉(zhuǎn)載于:https://www.cnblogs.com/AcAc-t/p/Django_HttpRequester_python.html
總結(jié)
以上是生活随笔為你收集整理的搭建简单Django服务并通过HttpRequester实现GET/POST http请求提交表单的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第六次会议(4.15)
- 下一篇: Mock Server利器 - Moco