Python3+Django get/post请求实现教程详解

Hazel
Hazel
发布时间:2026-10-14 | 6人浏览过
原创

本文详解基于Python3和Django框架实现Get与Post请求的完整流程。内容涵盖项目创建、模板路径配置、路由设置及视图逻辑编写,重点解析POST请求中CSRF Token的生成与验证机制,以及DEBUG模式下的错误处理与安全配置建议。

一、说明

此前曾撰写过一篇关于“Python3+PyCharm+Django+Django REST framework”的开发教程,初衷是直接进入RESTful架构的介绍。但回顾后发现,REST虽然有助于解耦,却显著增加了框架的复杂度;若无需多终端支持,REST反而未降低复杂度,甚至使其更高。此外,基础的Get和Post请求实现仍需花费大量时间查阅资料。因此,有必要单独撰写本文,专门介绍Django常规的MVC开发模式。

环境搭建与项目创建步骤与之前介绍REST的部分(Django 2.5及更早版本)类似,此处不再赘述。本文示例创建的项目名为django1,其初始目录结构如下所示。

二、环境配置

若创建的项目名称并非django1,请将下文所有出现的“django1”替换为实际的项目名称。

2.1 自定义模版路径及创建模版

编辑django1/django1/settings.py文件,定位到TEMPLATES变量,将DIRS的值修改为BASE_DIR加上“/django1/templates”。

在django1/django1目录下新建templates文件夹,并在其中创建get.html、post.html和result.html三个文件。

get.html文件用于处理Get提交,其代码如下。


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>get请求示例</title>
</head>
<body>
  <form action="/get" method="get">
    <input type="text" name="q" />
    <input type="submit" value="搜索" />
  </form>
</body>
</html>

post.html文件用于处理Post提交。其中{%%}表示Django模板语句,{% csrf_token %}指示表单加载时返回Token,提交时需进行Token认证(若需关闭服务端的CSRF防护功能,可将settings.py中MIDDLEWARE下的'django.middleware.csrf.CsrfViewMiddleware'注释掉)。


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>post请求示例</title>
</head>
<body>
  <form action="/post" method="post">
    {% csrf_token %}
    <input type="text" name="q" />
    <input type="submit" value="搜索" />
  </form>
</body>
</html>

result.html文件用于显示Get和Post提交后的输入内容。其中{{}}表示Django模板变量。


<h1>{{ result }}</h1>

2.2 配置请求路由

Django的所有请求路由均由urls.py配置,即便是存在的静态文件(如html)也必须配置路由才能被访问。

编辑django1/django1/urls.py文件,将其修改为以下内容。


from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from . import view

urlpatterns = [
  path('admin/', admin.site.urls),
  # url(r'^hello$', view.hello),
  url(r'^get\.html$', view.get_html),
  url(r'^get$', view.get),
  url(r'^post\.html$', view.post_html),
  url(r'^post$', view.post),
]

2.3 实现处理逻辑

在2.2节中,我们配置了get.html、get、post.html和post四个请求,分别转交给view.get_html、view.get、view.post_html和view.post进行处理。本节将实现这四个处理逻辑。

在django1/django1文件夹下创建view.py文件,写入以下内容。


from django.shortcuts import render, render_to_response

def get_html(request):
  return render_to_response('get.html')

def get(request):
  context = {}
  # 通过request.GET['name']形式获取get表单内容
  # result为重定向到的result.html所使用的变量
  context['result'] = f"你搜索的内容为:{request.GET['q']}"
  return render(request, 'result.html', context)

def post_html(request):
  # 不能和get一样使用render_to_response必须使用render进行重定向,不然服务端不会设置csrf_token
  # return render_to_response('post.html')
  return render(request, 'post.html')

def post(request):
  context = {}
  # 通过request.GET['name']形式获取post表单内容
  # result为重定向到的result.html所使用的变量
  context['result'] = f"你搜索的内容为:{request.POST['q']}"
  return render(request, 'result.html', context)

请注意注释中强调的内容:在post_html函数中,不能使用render_to_response,必须使用render进行重定向。否则服务器无法成功返回Token,导致Token验证失败,进而无法访问页面(报错:403,CSRF token missing or incorrect.)。具体现象如下图所示。

此外,如上所示返回了详细的错误信息,这在信息安全领域通常被视为忌讳。但这并非Django未考虑周全,而是因为Django默认开启了DEBUG模式。在settings.py中设置DEBUG = False,并配置ALLOWED_HOSTS即可解决(注意:ALLOWED_HOSTS并非指允许访问服务的IP,而是允许外部访问的服务地址)。

三、运行效果

3.1 总体目录结构

经过第二节的所有操作,项目目录结构如下图所示(.idea和__pycache__目录可忽略)。

3.2 运行效果

Get请求页面显示如下。

Get请求结果如下。

Post请求页面显示如下。

Post请求结果如下。

本文主要介绍了Django中Get/Post请求的简单实现方法。若想了解更多关于Django的使用教程,请查看相关链接。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表