[Django系列]9.表单,request和response

1.表单

表单是HTML中用于提交数据给服务器的一个标签,所有的表单元素(input/textarea/button…)都要放在form标签当中.然后有以下参数:

1. formmethod参数用于设置表单的提交方式,默认使用POST.
2. action用于设置表单的提交url,如果不写或者保持空字符串,那么将使用当前的URL.
1.1 GET和POST:
  • 1.GET:GET如其名,是从服务器获取数据,不会更改服务器的状态和数据,在URL中携带参数发送给服务器。
  • 2.POST则是将一定量的数据发送给服务器,一般会更改服务器的数据。
  • 3.POST方法的参数不能在URL当中看到,他是通过body参数传递给服务器的,所以相对GET方法直接能在URL当中看到传递的参数,显得更加安全一些.当然,也不能简单的判定POST方法比GET方法更安全,要使网站保持安全,需要做更多的安全处理.

十贱出真汁

一.用HTML表单实现一个简单的加法运算,要求输入a,b,通过表单提交返回求和结果
创建一个tools的应用,tools/views.py下定义2个视图函数index和add.
  • index是接受get请求,并返回用户一个表单,通过表单get方式提交
  • add函数是对index的地址的get参数进行接收,并完成加法运算,返回给前台
#tools/views.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
from django.http import HttpResponsedef index(request): #渲染函数的第一个参数是HttpRequest类型的对象
    return render(request, 'index.html')
​
def add(request): #http://127.0.0.1:8000/add/?a=xxx&b=ooo
    a = request.GET['a']    #request.GET.get('a')
    b = request.GET['b']
    a = int(a)
    b = int(b)
    return HttpResponse(str(a+b))
网页模板index.html
#tools/index.html 前端模板
<html>
<body>
<p>请输入两个数字</p>
<!--提交的参数格式是http://127.0.0.1:8000/add/?a=xxx&b=yyy-->
<form action="/add/" method="get">
    a: <input type="text" name="a"> <br>
    b: <input type="text" name="b"> <br>
    <input type="submit" value="提交">
</form>
</body>
</html>
简单的2个路由
#urls.py
from django.conf.urls import url
from django.contrib import admin
from tools import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$',views.index), #接收主页信息
    url(r'^add/$',views.add),
]
演示效果

但是这种方式也存在弊端,如果前台不老老实实的传入数字,那么就会报错.这个错误来自于视图函数int()类型转换报错.

有没有一种办法时,前台传进来之前,如果不是合法的数据,就直接拒绝不让传入后台呢?Of course!

二.使用Django内置form来实现.
要使用Django的form,需要在django的应用tools下面新增一个文件,forms.py,目录树结构如下
ddc@SERVER:~/djcode/calc$ tree tools
── tools
    ├── admin.py
    ├── admin.pyc
    ├── apps.py
    ├── forms.py
    ├── forms.pyc
    ├── __init__.py
    ├── __init__.pyc
    ├── migrations
       ├── __init__.py
       └── __init__.pyc
    ├── models.py
    ├── models.pyc
    ├── templates
       └── index.html
    ├── tests.py
    ├── views.py
    └── views.pyc
forms的本质同models一样,是一个类,我们需要使用的时候,只需要集成forms.Form这个类即可
#tools/forms.py
from django import forms #导入forms
class AddForm(forms.Form):  #定义一个我们自己的类,类型名AddForm见名思议,是做一个加法
    a = forms.IntegerField()  #定义两个整型的输入框
    b = forms.IntegerField()
views视图函数,只需要定义一个index,就能实现上述功能.使用django内置表单跟使用models一样,需要从应用目录导入模块AddForm
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
from django.http import HttpResponse
from .forms import AddForm #forms.py位于当前目录tools下,导入定义好的类AddForm方便直接使用def index(request):
    if request.method == 'POST': #这里用一个request.method判断是POST还是GET方法,区别对待
        print "request POST data: ",request #打印请求到的数据,实际返回的是<WSGIRequest: POST '/'>对象
        form = AddForm(request.POST) #将POST传过来额参数,给AddForm进行处理,实例化为form这个类
        if form.is_valid():         #通过form内置方法is_valid判断输入的数值是否荷花,合法则下一步
            a = form.cleaned_data['a'] #从表单中清洗数据,取出a的值.
            b = form.cleaned_data['b']
            return HttpResponse(str(int(a) + int(b))) #求和返回
    else:                       #如果请求的方法是get,那么就返回一个表单的对象给前台,等待接收数据
        form = AddForm() 
    return render(request, 'index.html', {'form': form}) #表单通过上下文字典,被渲染到html模板文件上
这里模板用{{form}}变量接收前台传过来的django内置表单,并使用input submit标签,提交数据到当前页面.
<!DOCTYPE html>
<html>
<body>
<form  method="post">
{# 安全有关的标签#}
{% csrf_token%}
{# form会被Form类型的对象赋值#}
{{form}}
<input type="submit" value="提交">
</form>
</body>
</html>
演示效果

查看实际的源代码

所以django的form表单在性价比上,还是很有优势的.

2.表单后面的request和response

2.1 HttpRequest:
  • 1.request.scheme:网络请求的协议,一般是http和https
  • 2.request.body:http请求中传递的原始数据,是一个byte类型的string,如果要处理form表单上传上来的数据,应该使用request.POST,这个处理得比较好。
  • 3.request.path:当前请求的URL路径,但是不包括scheme和域名,比如有http://www.myblog.com/blog/1。那么返回的将是/blog/1。会去除掉http和www.myblog.com
  • 4.request.method:当前这个请求访问方法,一般为GET和POST,例如可以通过以下方式进行判断:
    request.GET
    一个QueryDict的类字典类型的对象,可以通过访问字典的方式进行访问里面的值,里面的值是通过GET请求传递进来的参数。
    request.POST
    request.GET,但是是保存了通过POST请求传递上来的参数。注意,这个POST里面不包含上传的文件信息。如果要访问上传的文件,请使用request.FILES
    5.request.COOKIES:一个字典类型,包含了所有的cookie信息,key和value都是字符串。
    6.request.META:存储所有请求的头部信息。
    META是一个标准的Python字典,包含所有可能的 HTTP .
    可用的 header 依赖客户机和服务器,下面是某些可能的值:
    CONTENT_LENGTH
                CONTENT_TYPE
    HTTP_ACCEPT_ENCODING
                HTTP_ACCEPT_LANGUAGE
                HTTP_REFERER
    引用页,如果有的话
    HTTP_USER_AGENT 客户机用户代理字符串
                QUERY_STRING
    查询字符串,单一的未解析的字符串
                REMOTE_ADDR 客户机IP地址
                REMOTE_HOST 客户机hostname
    REQUEST_METHOD 请求方式,比如 GET  POST
                SERVER_NAME 服务器 hostname
                SERVER_PORT 服务器端口
  • 7.request.session:返回一个QueryDict的类字典类型的集合,这个属性要有效,必须添加SessionMiddleware这个中间件。
  • 8.request.is_secure():如果是HTTPS的,那么返回True,否则返回False
  • 9. request.is_ajax():这个请求是否是通过XMLHttpRequest进行访问的。他的实现原理就是去request.META中查找HTTP_X_REQUESTED_WITH,如果是XMLHttpRequest,那么将返回True,否则返回False。一般在第三方库如jQuery中使用ajax方法都设置了这个值,如果自己手动写XMLHttpRequest,那么需要自己添加这个header,is_ajax这个方法才能生效。
以12306为例:模拟发送一个长沙-南宁的 查询余票的报文

2.2 HttpResponse对象:
  • 1.ttpResponse.__init__(content=’’,content_type=None,status=200,reason=None,charset=None)构造方法:
content:代表要发送给客户端的内容。
content_type:代表发送给客户端的内容类型,默认是“text/html;charset=utf-8”。
charset:响应体的编码,如果没有指定,则会使用content_type中设置的charset
  • 2.set_cookie(key,value=’’,max_age=None,expires=None,path=’/’,domain=None,secure=None,httponly=False)设置cookie的方法。
keycookiekey
valuecookievalue
max_agecookie最大的过期时间。
expirescookie的过期时间和日期。
path:针对哪个目录下有效果。
domain:域名,如果你想跨域使用cookie,必须设置这个值,比如domain=.lawrence.com”,那么www.lawrence.comblogs.lawrence.comcalendars.lawrence.com都可以访问到这个cookie
httponly:如果设置为True,客户端的js代码将不能访问到cookie
  • 3.delete_cookie(key,path=’/’,domain=None):删除cookie。
接收到的response报文情况

总结

表单和HttpRequst都是本节课的重点内容,请熟悉掌握.
赞(0)
未经允许不得转载:http://www.yueguangzu.net逗逗网 » [Django系列]9.表单,request和response
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址