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

调试Django框架写的服务时,需要模拟客户端发送POST请求,然而浏览器只能模拟简单的GET请求(将参数写在url内),网上搜索得到了HttpRequester这一firefox插件,完美的实现了模拟POST提交表单的需求,这里记录一下简单Django服务的搭建、以及使用HttpRequester对应进行GET/POST请求操作的流程。

1,搭建Django服务

1.1 搭建简单服务

搭建一个简单的Django服务很容易,只需要一行命令即可创建一个可运行的Django服务,若未安装Django,则需要先执行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 增加自定义模块

我们手动添加一个子模块faketest,在其中创建一个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等多种methods。

2.1 GET方法请求Django服务:

GET由于仅通过请求行传递参数,即将参数通过?和&符号添加到url后面,所以其实简单的将请求行复制到浏览器地址栏,就可以实现GET请求了,以下为用HTTPRquester进行GET请求的结果:

对应Django服务后台的控制台输出,注意由于GET请求里面没有有效的body数据,json试图对body进行解析时,抛出了一个异常:

2.2 POST方法请求Django服务

POST方法请求要麻烦一些,根据POST body的具体内容要设置好对应的content_type,这里以application/json和application/x-www-form-urlencoded两种content_type的提交举例观察非表单和表单提交的POST请求。

2.2.1非表单内容提交:

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

可以从右边的返回结果里面看到,request的body成员就是POST请求时的contetn内容,并且在服务中经过json解析后,又再次返回放入服务返回的json串之中了,同时这次由于body中是可以正常解析的json串,所以服务端并没有抛异常,而是将json串解析后又返回给了调用方。

可以注意到,服务收到POST请求时,其request.POST对象却是一个空字典,并没有任何POST请求里面的content内容,这是为什么呢?

这涉及到Django框架的具体实现,根据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的实现中,request.POST对象是用于存储包含表单数据的对象,而在request.body中则包含了content中的原始(raw)非表单数据,接下来我们通过POST传递表单数据来进一步验证这一点。

2.2.2 POST请求提交表单数据

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

可以看到,在返回结果中body和POST都有了数据,body包含的是未经解析的原始content数据,由于不是一个有效json串,在试图解析时还抛了异常,而POST则是一个字典,以key-value的形式包含了解析了的body数据。

时间: 2025-01-01 08:28:14

搭建简单Django服务并通过HttpRequester实现GET/POST请求提交表单的相关文章

向Django提交表单

Python的django框架,做了一个前端页面,其中有一向要求提交表单,暂且总结一下流程,有不对的地方请指正: 1.在HTML页面写表单: <form enctype="multipart/form-data" method="POST" action="{% url 'upload' %}"> {% csrf_token %} <input type="file" name="your_file

maven+spring boot搭建简单微服务

项目需要使用spring boot,所以自学了几天,仅提供给新手,请根据文档查看-该项目仅是测试项目,并不完善和严谨,只实现了需要使用的基本功能.写该博客一是希望能够帮助刚学习的新人,二是加深自己的印象,如果忘了也可以再看看,有些片段是从其他博客学习来的,如有问题希望能提出来,由衷的表示感谢. 主要开发环境:jdk:1.8: maven:3.3:tomcat:8等. 涉及技术:spring boot.springMVC.maven.JdbcTemplate.json.HttpClient等. 推

Django实战(一)-----用户登录与注册系统4(表单)

我们前面都是手工在HTML文件中编写表单form元素,然后在views.py的视图函数中接收表单中的用户数据,再编写验证代码进行验证,最后使用ORM进行数据库的增删改查.这样费时费力,整个过程比较复杂,而且有可能写得不太恰当,数据验证也比较麻烦. 设想一下,如果我们的表单拥有几十上百个数据字段,有不同的数据特点,如果也使用手工的方式,其效率和正确性都将无法得到保障. 有鉴于此,Django在内部集成了一个表单功能,以面向对象的方式,直接使用Python代码生成HTML表单代码,专门帮助我们快速处

16.Django提交表单

Django表单提交一共有三种方式: 1.不使用Django组件进行提交 2.使用django.forms.Form(所有表单类的父类)进行提交 3.使用django.forms.ModelForm(可以和模型绑定的Form)进行提交 这里的例子是,给Publisher这个表里添加数据,表结构如下: class Publisher(models.Model): name = models.CharField("名称",max_length=30) address = models.Ch

用jsp实现简单的图片上传功能(multipart/form-data形式的表单)

2008-10-11 22:07 用jsp实现简单的图片上传功能 1 先做一个页面,选择上传的图片<body>   <form action="uploadServlet" enctype="multipart/form-data" method="POST" >           selectimage: <input type="file" name="myfile"/&

OpenLayer3+PostGIS+GeoServer 搭建简单GIS服务框架问题探究

传统GIS开发中,我们一般会采用ArcGIS或者SuperMap作为GIS平台来进行开发,简单的分析查询会采用官方api或者leaflet,esri-leaflet等进行开发,复杂的查询分析统计功能会利用Geoprocessor(简称GP)来进行操作,采用这种商业平台好处显而易见是开发效率很大的提升,因为在这么多年的发展过程中,官方社区或者一些解决方案都很成熟.在开发过程中遇到的一般问题如果不是很好解决,也可以很方便的向技术支持寻求帮助.但是缺点就是费用很高,一整套产品下来就要好几十万,对于开发

使用node搭建简单的服务

//创建依赖模块var http = require('http');var url = require('url');var fs = require('fs');var server = http.createServer();var htmlDir = __dirname + '/';//console.log(htmlDir); //处理url请求function sendData(file,req,res) {    // console.log('file: ' + file);  

php 使用curl 进行简单模拟提交表单

//初始化curl $ch = curl_init(); $url = 'xxx'; $option = [ CURLOPT_URL => $url, CURLOPT_HEADER => 1, CURLOPT_RETURNTRANSFER => 1, ]; curl_setopt_array($ch, $option); $output = curl_exec($ch); preg_match_all('/Set-Cookie: (.*);/i', $output, $str); //正

Django表单——概述

参考文献: https://docs.djangoproject.com/zh-hans/2.0/topics/forms/ HTML 表单 一个表单必须明确两个要素: where: 应返回与用户输入相对应的数据的URL how:应该返回数据的HTTP方法 GET和POST GET和POST是处理表单时唯一使用的HTTP方法. 使用POST方法返回Django的登录表单,其中浏览器捆绑表单数据,对其进行编码以进行传输,将其发送到服务器,然后接收其响应. 相反,GET将提交的数据捆绑成一个字符串,