首页 > 编程语言 >python初试四

python初试四

时间:2023-12-25 18:01:47浏览次数:37  
标签:初试 form 表格 python request investigate csrf POST

我们在上一课中讲到了服务器上的数据。当时我们是用手动的方式,直接在数据库插入数据。我们将允许客户向服务器传递数据。

表格是客户向服务器传数据的经典方式。我们先会看到传统的表格提交,然后了解Django的表格对象。


html表格

HTTP协议以“请求-回复”的方式工作。客户发送请求时,可以在请求中附加数据。服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务。  

(http协议的运作方式,详见http协议)

HTML文件中可以包含表格标签。HTML表格的目的是帮助用户构成HTTP请求,把数据用GET或者POST的方法,传递给某一URL地址。下面是一个表格的例子:

<form action="/west/investigate/" method="get">
  <input type="text" name="staff">
  <input type="submit" value="Submit">
</form>

这里的form标签有两个属性。action用于说明URL地址,method说明请求的方法。

表格中还包含有两个input标签,即两个输入栏目。根据type的不同,第一个为一个文本框,第二个为一个提交按钮。name为输入栏的名字。服务器在解析数据时,将以name为索引。

我们可以将上面的表格直接存入模板form.html,并在west/views.py中定义一个视图form()来显示表格:

from django.shortcuts import render

def form(request):
    return render(request, 'form.html')

设置urls.py,让对[site]/west/form/的访问,指向该视图。

最后,我们在west/views.py中定义investigate()来处理该表格提交的数据:

from django.shortcuts import render

def investigate(request):
    rlt = request.GET['staff']
    return HttpResponse(rlt)

可以看到,HTTP请求的相关信息,包括请求的方法,提交的数据,都包含在request参数中。


表格是通过GET方法提交的。我们可以通过request.GET['staff'],来获得name为staff的输入栏的数据。该数据是一个字符串。investigate()将直接显示该字符串。

设置urls.py,让该处理函数对应action的URL([site]/west/investigate/)。

当我们访问http://127.0.0.1:8000/west/form时,将显示:

提交表格后,页面将转到[site]/west/investigate。investigate()读取字符串后,在页面上显示出来。


POST方法

上面我们使用了GET方法。视图显示和请求处理分成两个函数处理。

提交数据时更常用POST方法。我们下面使用该方法,并用一个URL和处理函数,同时显示视图和处理请求。

先创建模板investigate.html

<form action="/west/investigate/" method="post">
  {% csrf_token %}
  <input type="text" name="staff">
  <input type="submit" value="Submit">
</form>

<p>{{ rlt }}</p>

我们修改提交表格的方法为post。在模板的末尾,我们增加一个rlt记号,为表格处理结果预留位置。

表格后面还有一个{% csrf_token %}的标签。csrf全称是Cross Site Request Forgery。这是Django提供的防止伪装提交请求的功能。POST方法提交的表格,必须有此标签。

在west/views.py中,用investigate()来处理表格:

from django.shortcuts import render
from django.core.context_processors import csrf

def investigate(request):
    ctx ={}
    ctx.update(csrf(request))
    if request.POST:
        ctx['rlt'] = request.POST['staff']
    return render(request, "investigate.html", ctx)

这里的csrf()是和上面的{% csrf_token %}对应。我们在这里不深究。

看程序的其它部分。对于该URL,可能有GET或者POST方法。if的语句有POST方法时,额外的处理,即提取表格中的数据到环境变量。


存储数据

我们还可以让客户提交的数据存入数据库。使用庄园疑云中创建的模型。我们将客户提交的字符串存入模型Character。

修改west/views.py的investigate():

from django.shortcuts import render
from django.core.context_processors import csrf

from west.models import Character

def investigate(request):
    if request.POST:
        submitted  = request.POST['staff']
        new_record = Character(name = submitted)
        new_record.save()
    ctx ={}
    ctx.update(csrf(request))
    all_records = Character.objects.all()
    ctx['staff'] = all_records
    return render(request, "investigate.html", ctx)

在POST的处理部分,我们调用Character类创建新的对象,并让该对象的属性name等于用户提交的字符串。通过save()方法,我们让该记录入库。

随后,我们从数据库中读出所有的对象,并传递给模板。

我们还需要修改模板investigate.html,以更好的显示:

<form action="/west/investigate/" method="post">
  {% csrf_token %}
  <input type="text" name="staff">
  <input type="submit" value="Submit">
</form>

{% for person in staff %}
<p>{{ person }}</p>
{% endfor %}

我们使用模板语言的for,来显示所有的记录。


表格对象

客户提交数据后,服务器往往需要对数据做一些处理。比如检验数据,看是否符合预期的长度和数据类型。在必要的时候,还需要对数据进行转换,比如从字符串转换成整数。这些过程通常都相当的繁琐。

Django提供的数据对象可以大大简化这一过程。该对象用于说明表格所预期的数据类型和其它的一些要求。这样Django在获得数据后,可以自动根据该表格对象的要求,对数据进行处理。

修改west/views.py:

from django.shortcuts import render
from django.core.context_processors import csrf

from west.models import Character

from django import forms

class CharacterForm(forms.Form):
    name = forms.CharField(max_length = 200)

def investigate(request):
    if request.POST:
        form = CharacterForm(request.POST)
        if form.is_valid():
            submitted  = form.cleaned_data['name']
            new_record = Character(name = submitted)
            new_record.save()

    form = CharacterForm()
    ctx ={}
    ctx.update(csrf(request))
    all_records = Character.objects.all()
    ctx['staff'] = all_records
    ctx['form']  = form
    return render(request, "investigate.html", ctx)

上面定义了CharacterForm类,并通过属性name,说明了输入栏name的类型为字符串,最大长度为200。

在investigate()函数中,我们根据POST,直接创立form对象。该对象可以直接判断输入是否有效,并对输入进行预处理。空白输入被视为无效。

后面,我们再次创建一个空的form对象,并将它交给模板显示。

在模板investigate.html中,我们可以直接显示form对象:

<form action="/west/investigate/" method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <input type="submit" value="Submit">
</form>

{% for person in staff %}
<p>{{ person }}</p>
{% endfor %}

如果有多个输入栏,我们可以用相同的方式直接显示整个form,而不是加入许多个<input>标签。

python初试四_django

标签:初试,form,表格,python,request,investigate,csrf,POST
From: https://blog.51cto.com/u_15974582/8970783

相关文章

  • python枚举类型Enum
    在Python中,枚举类型可以通过enum模块来实现。enum模块提供了Enum类,用于创建具有命名值的枚举类型。枚举类型的创建方式包括使用类定义、使用函数和使用装饰器。1.定义一个枚举类fromenumimportEnumclassWeekday(Enum):MONDAY=1TUESDAY=2WE......
  • Python描述符
    1、描述符定义先看下描述符的定义。如果在一个新式类中至少实现了__get__(),__set__(),__delete__()中的一个,则称作这个的新式类为描述符,也称为描述符协议。__get__():调用一个属性时触发;__set__():一个属性赋值时触发;__delete__():采用del删除属性时触发;......
  • Python 爬虫在数据分析方面有什么潜力
    在当今信息爆炸的时代,大量的数据被生成和存储,这给企业、学术界和个人提供了巨大的机会和挑战。爬虫作为一种数据获取的技术手段,可以帮助我们从互联网上获取大量的数据。结合数据分析技术,爬虫在数据分析方面具有巨大的潜力。本文将介绍一些爬虫在数据分析方面的潜力和应用场景。1.获......
  • python的任何题目开头加上一句class的语句就是面向对象程序设计吗
    Python的任何题目开头加上一句class的语句并不意味着是面向对象程序设计(Object-OrientedProgramming,OOP)。面向对象程序设计是一种编程范式,它将程序组织为对象的集合,每个对象都有自己的状态和行为,并且可以与其他对象进行交互。在Python中,使用class关键字可以定义类,类是对象的蓝图,描......
  • 如何将 python 升级
    要升级Python,您可以采取以下步骤:备份数据:在进行升级之前,建议备份您的Python项目和数据以防万一。选择Python版本:决定要升级到的Python版本。访问Python官方网站,查看可用的稳定版本。下载新版本:使用以下命令下载并安装您选择的Python版本。请替换x.y.z为实际的版本号。......
  • python Django项目在jenkins中部署
    1.在jenkins中创建一个自由风格的job: 配置git源代码仓库:构建机制的配置: 配置执行shell脚本: ps-ef|grep0.0.0.0:8088|grep-vgrep|awk'{print$2}'|xargskill-9echo"=============Finishtokillreleasewikirealprocess=================="BUIL......
  • Python - pandas 报错:ValueError: 'HIS_批准文号' is both an index level and a colu
    问题描述file:[Terminal]ValueError:'HIS_批准文号'isbothanindexlevelandacolumnlabel,whichisambiguous.ValueError:cannotinsert招采_批准文号,alreadyexists有这两个错误,使用函数merge合并的时候出现第一个错误,将两个DataFrame的索引reset_index......
  • Windows环境 CMake 配置C++调用Python
    #CMakeLists.txtadd_library(python3STATICIMPORTED)#这里是使用python的安装路径set_target_properties(python3PROPERTIESIMPORTED_LOCATION"D:/python/libs/python39.lib")#使用python的静态库target_link_libraries(TestDemo......
  • Python——第五章:csv模块
    未来我们会使用爬虫获取到一些json文件,例如去英雄联盟官方爬取英雄的数据库查看代码{"hero":[{"heroId":"1","name":"\u9ed1\u6697\u4e4b\u5973","alias":"Annie","title":"\u5b89\u59ae","roles"......
  • python3 多线程ping当前网段主机是否存活
    1.python3多线程#主线程只负责生成工作线程#工作线程只做具体的工作#多线程共享进程里的内存块#多进程不共享importthreadingdefHello(world,tedu):print('Hello%s%s!'%(world,tedu))if__name__=='__main__':foriinrange(3):th......