python和jsp交互_Python Django 前后端数据交互 之 HttpRequest、HttpResponse、render、redirect...

本文详细介绍了Django框架中HttpRequest对象的属性和方法,包括GET、POST数据的获取,以及其他重要信息如请求方法、头部信息、Cookies和FILES等。还提到了QueryDict对象的特性,用于处理HTTP请求中的数据。
摘要由CSDN通过智能技术生成

每当一个用户请求发送过来,Django将HTTP数据包中的相关内容,打包成为一个HttpRequest对象,并传递给每个视图函数作为第一位置参数,

也就是request,供我们调用,这一过程是系统自动完成的。

例如:前台请求数据包含username和password两个字段。例如网址http://127.0.0.1/xxxx/xxx?username=luanpeng&password=123

其中的xxx为网址映射,在urlsl路由映射部分再做详解。

# 接收请求数据返回字符串响应

def index(request):

if request.method == "POST":

username = request.POST.get("username", None)   # 读取post数据,None为默认值

password = request.POST.get("password", None)   # 读取post数据,None为默认值

if request.method == "GET":

username = request.GET.get("username", None)   # 读取get数据

password = request.GET.get("password", None)  # 读取get数据

...123456789

在获取数据时,通常会提供一个默认值,防止请求数据中没有目标属性时触发KeyError异常。

不仅如此,HttpRequest对象中包含了非常多的重要的信息和数据,应该熟练掌握它。

1)HttpRequest属性

(1)、 HttpRequest.scheme

字符串类型,表示请求的协议种类,’http’或’https’。

(2)、 HttpRequest.body

bytes类型,表示原始HTTP请求的正文。它对于处理非HTML形式的数据非常有用:二进制图像、XML等。如果要处理常规的表单数据,应该使用HttpRequest.POST。还可以使用类似读写文件的方式从HttpRequest中读取数据,参见HttpRequest.read()。

(3)、 HttpRequest.path

字符串类型,表示当前请求页面的完整路径,但是不包括协议名和域名。例如:”/music/bands/the_beatles/”。这个属性,常被用于我们进行某项操作时,如果不通过,返回用户先前浏览的页面。非常有用!

(4)、 HttpRequest.path_info

在某些Web服务器配置下,主机名后的URL部分被分成脚本前缀部分和路径信息部分。path_info 属性将始终包含路径信息部分,不论使用的Web服务器是什么。使用它代替path可以让代码在测试和开发环境中更容易地切换。

例如,如果应用的WSGIScriptAlias设置为/minfo,那么HttpRequest.path等于/music/bands/the_beatles/ ,而HttpRequest.path_info为/minfo/music/bands/the_beatles/。

(5)、HttpRequest.method

字符串类型,表示请求使用的HTTP方法。默认为大写。 像这样:

if request.method == 'GET':

do_something()

elif request.method == 'POST':

do_something_else()1234

通过这个属性来判断请求的方法,然后根据请求的方法不同,在视图中执行不同的代码。

(6)、HttpRequest.encoding

字符串类型,表示提交的数据的编码方式(如果为None 则表示使用DEFAULT_CHARSET设置)。 这个属性是可写的,可以通过修改它来改变表单数据的编码。任何随后的属性访问(例如GET或POST)将使用新的编码方式。

(7)、HttpRequest.content_type

Django1.10中新增。表示从CONTENT_TYPE头解析的请求的MIME类型。

(8)、HttpRequest.content_params

Django 1.10中新增。包含在CONTENT_TYPE标题中的键/值参数字典。

(9)、HttpRequest.GET

一个类似于字典的对象,包含GET请求中的所有参数。 详情参考QueryDict文档。

(10)、HttpRequest.POST

一个包含所有POST请求的参数,以及包含表单数据的字典。 详情请参考QueryDict文档。 如果需要访问请求中的原始或非表单数据,可以使用HttpRequest.body属性。

注意:请使用if request.method == “POST”来判断一个请求是否POST类型,而不要使用if request.POST。

POST中不包含上传文件的数据。

(11)、HttpRequest.COOKIES

包含所有Cookie信息的字典。 键和值都为字符串。可以类似字典类型的方式,在cookie中读写数据,但是注意cookie是不安全的,因此,不要写敏感重要的信息。

(12)、HttpRequest.FILES

一个类似于字典的对象,包含所有上传的文件数据。 FILES中的每个键为中的name属性值。 FILES中的每个值是一个UploadedFile。

要在Django中实现文件上传,就要靠这个属性!

如果请求方法是POST且请求的

中带有enctype=”multipart/form-data”属性,那么FILES将包含上传的文件的数据。 否则,FILES将为一个空的类似于字典的对象,属于被忽略、无用的情形。

下面为使用模型处理上传的文件的一个示例。

from django.http import HttpResponseRedirect

from django.shortcuts import render

from .forms import ModelFormWithFileField

def upload_file(request):

if request.method == 'POST':

form = ModelFormWithFileField(request.POST, request.FILES)

if form.is_valid():

# 这么做就可以了,文件会被保存到Model中upload_to参数指定的位置

form.save()

return HttpResponseRedirect('/success/url/')

else:

form = ModelFormWithFileField()

return render(request, 'upload.html', {'form': form})1234567891011121314

(13)、HttpRequest.META

包含所有HTTP头部信息的字典。 可用的头部信息取决于客户端和服务器,下面是一些示例:

CONTENT_LENGTH —— 请求正文的长度(以字符串计)。

CONTENT_TYPE —— 请求正文的MIME类型。

HTTP_ACCEPT —— 可接收的响应Content-Type。

HTTP_ACCEPT_ENCODING —— 可接收的响应编码类型。

HTTP_ACCEPT_LANGUAGE —— 可接收的响应语言种类。

HTTP_HOST —— 客服端发送的Host头部。

HTTP_REFERER —— Referring页面。

HTTP_USER_AGENT —— 客户端的user-agent字符串。

QUERY_STRING —— 查询字符串。

REMOTE_ADDR —— 客户端的IP地址。想要获取客户端的ip信息,就在这里!

REMOTE_HOST —— 客户端的主机名。

REMOTE_USER —— 服务器认证后的用户,如果可用。

REQUEST_METHOD —— 表示请求方法的字符串,例如”GET” 或”POST”。

SERVER_NAME —— 服务器的主机名。

SERVER_PORT —— 服务器的端口(字符串)。

2)HttpRequest方法

(1)、HttpRequest.get_host()[source]

据HTTP_X_FORWARDED_HOST和HTTP_HOST头部信息获取请求的原始主机。 如果这两个头部没有提供相应的值,则使用SERVER_NAME和SERVER_PORT。

例如:”127.0.0.1:8000”

注:当主机位于多个代理的后面,get_host()方法将会失败。解决办法之一是使用中间件重写代理的头部

(2)、HttpRequest.get_port()[source]

使用META中HTTP_X_FORWARDED_PORT和SERVER_PORT的信息返回请求的始发端口。

(3)、HttpRequest.get_full_path()[source]

返回包含完整参数列表的path。例如:/music/bands/the_beatles/?print=true

(4)、 HttpRequest.build_absolute_uri(location)[source]

返回location的绝对URI形式。 如果location没有提供,则使用request.get_full_path()的值。

例如:”https://example.com/music/bands/the_beatles/?print=true”

注:不鼓励在同一站点混合部署HTTP和HTTPS,如果需要将用户重定向到HTTPS,最好使用Web服务器将所有HTTP流量重定向到HTTPS。

(5)、HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt=”, max_age=None)[source]

从已签名的Cookie中获取值,如果签名不合法则返回django.core.signing.BadSignature。

可选参数salt用来为密码加盐,提高安全系数。 max_age参数用于检查Cookie对应的时间戳是否超时。

(6)、 HttpRequest.is_secure()[source]

如果使用的是Https,则返回True,表示连接是安全的。

(7)、HttpRequest.is_ajax()[source]

如果请求是通过XMLHttpRequest生成的,则返回True。

这个方法的作用就是判断,当前请求是否通过ajax机制发送过来的。

(8)、 HttpRequest.read(size=None)[source]

(9)、HttpRequest.readline()[source]

(10)、HttpRequest.readlines()[source]

(11)、 HttpRequest.xreadlines()[source]

(12)、 HttpRequest.iter()

上面的几个方法都是从HttpRequest实例读取文件数据的方法。

3)QueryDict对象

在应用中我们主要操作的就是GET和POST属性了。这里面包含了我们想要的数据。除了从QueryDict中获取数据,有时服务器还需要创建QueryDict对象发起向其他服务器的访问。

在HttpRequest对象中,GET和POST属性都是一个django.http.QueryDict的实例。也就是说你可以按本文下面提供的方法操作request.POST和request.GET。

3.1、QueryDict对象方法

QueryDict 实现了Python字典数据类型的所有标准方法,因为它是字典的子类。

不同之处在于下面:

(1)、QueryDict.init(query_string=None, mutable=False, encoding=None)[source]

QueryDict实例化方法。注意:QueryDict的键值是可以重复的!

QueryDict('a=1&a=2&c=3')

返回:QueryDict: {'a': ['1', '2'], 'c': ['3']}>12

(2) 、classmethod QueryDict.fromkeys(iterable, value=”, mutable=False, encoding=None)[source]

循环将可迭代对象中的每个元素作为键值,并赋予同样的值(来至value参数)。

QueryDict.fromkeys(['a', 'a', 'b'], value='val')

返回:QueryDict: {'a': ['val', 'val'], 'b': ['val']}>12

(3)、 QueryDict.update(other_dict)

用新的QueryDict或字典更新当前QueryDict。类似dict.update(),但是追加内容,而不是更新并替换它们

>>> q = QueryDict('a=1', mutable=True)

>>> q.update({'a': '2'})

>>> q.getlist('a')

['1', '2']

>>> q['a'] # returns the last

'2'123456

(4)、QueryDict.items()

类似dict.items(),如果有重复项目,返回最近的一个,而不是都返回:

>>> q = QueryDict('a=1&a=2&a=3')

>>> q.items()

[('a', '3')]123

(5)、 QueryDict.values()

类似dict.values(),但是只返回最近的值。 像这样:

>>> q = QueryDict('a=1&a=2&a=3')

>>> q.values()

['3']123

(6)、QueryDict.copy()[source]

使用copy.deepcopy()返回QueryDict对象的副本。 此副本是可变的!

(7)、QueryDict.getlist(key, default=None)

返回键对应的值列表。 如果该键不存在并且未提供默认值,则返回一个空列表。

(8)、QueryDict.setlist(key, list_)[source]

为list_设置给定的键。

(9)、QueryDict.appendlist(key, item)[source]

将键追加到内部与键相关联的列表中。

(10)、QueryDict.setdefault(key, default=None)[source]

类似dict.setdefault(),为某个键设置默认值。

(11)、QueryDict.setlistdefault(key, default_list=None)[source]

类似setdefault(),除了它需要的是一个值的列表而不是单个值。

(12)、QueryDict.lists()

类似items(),只是它将其中的每个键的值作为列表放在一起。 像这样:

>>> q = QueryDict('a=1&a=2&a=3')

>>> q.lists()

[('a', ['1', '2', '3'])]123

(13)、QueryDict.pop(key)[source]

返回给定键的值的列表,并从QueryDict中移除该键。 如果键不存在,将引发KeyError。 像这样:

>>> q = QueryDict('a=1&a=2&a=3', mutable=True)

>>> q.pop('a')

['1', '2', '3']123

(14)、QueryDict.popitem()[source]

删除QueryDict任意一个键,并返回二值元组,包含键和键的所有值的列表。在一个空的字典上调用时将引发KeyError。 像这样:

>>> q = QueryDict('a=1&a=2&a=3', mutable=True)

>>> q.popitem()

('a', ['1', '2', '3'])123

(15)、QueryDict.dict()

将QueryDict转换为Python的字典数据类型,并返回该字典。

如果出现重复的键,则将所有的值打包成一个列表,最为新字典中键的值。

>>> q = QueryDict('a=1&a=3&a=5')

>>> q.dict()

{'a': '5'}123

(16)、QueryDict.urlencode(safe=None)[source]

已url的编码格式返回数据字符串。 像这样:

>>> q = QueryDict('a=2&b=3&b=5')

>>> q.urlencode()

'a=2&b=3&b=5'123

使用safe参数传递不需要编码的字符。 像这样:

>>> q = QueryDict(mutable=True)

>>> q['next'] = '/a&b/'

>>> q.urlencode(safe='/')

'next=/a%26b/'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值