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

1、说明

以前写了一篇“Python3+PyCharm+Django+Django REST framework开发教程 ”,想着直接介绍rest就完了。但回过头来看,一是rest在解耦的同时将框架复杂化了若是没有多终端那rest根本没有下降复杂度反而增长了复杂度,二是基础的get和post实现本身仍是看半天。因此仍是有必要再写一篇来介绍django常规的MVC开发。html

环境搭建程项目建立都相似的的rest化部分以前(2.5及以前)进行操做便可,就不重复说明了。这里我建立的项目为django1,初始目录结构以下django

 

2、环境配置

若是本身建立的项目不叫django1,则如下全部django1修改成本身的项目名。安全

 

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

编缉django1/django1/setting.py,定位到TEMPLATES变量,将DIRS的值修改成BASE_DIR+"/django1/templates",服务器

在django1/django1目录下建立templates文件夹,并在其下建立get.html、post.html、result.html三个文件。框架

get.html,用于get提交:ide

<!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附御功能将setting.py----MIDDLEWARE----'django.middleware.csrf.CsrfViewMiddleware'注释掉):post

<!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模板变量:url

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

 

2.2 配置请求路由

Django全部请求路由都由urls.py设置,即使是存在的静态文件(如html)也要配置路由才能访问。idea

编缉django1/django1/urls.py,修改成如下内容:spa

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、运行效果

3.1 整体目录结构

经第二大节全部操做,项目目录结构以下图所示(.idea和__pycache__不用管):

 

3.2 运行效果

get请求页面:

get请求结果:

post请求页面:

post请求结果:

 

参考:

http://www.runoob.com/django/django-form.html

相关文章
相关标签/搜索