美文网首页
Django请求与响应(request)与(response)

Django请求与响应(request)与(response)

作者: 昆仑草莽 | 来源:发表于2019-07-05 16:13 被阅读0次

HttpRequest对象:

服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的第一个参数是HttpRequest对象在django.http模块中定义了HttpRequest对象的API

属性 描述
path 一个字符串,表示请求页面的完整路径,不包含域名
method 一个字符串,表示请求使用的http方法,常用值包括‘GET’,‘POST’
encoding 一个字符串,表示提交数据的编码方式,如果为none,则表示使用浏览器的默认格式utf-8,这个属性是可写的,可以通过修改他来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值
GET 一个类似字典的对象,包含get访问的所有参数
POST 一个类似字典的对象,包含post访问的所有参数
FILES 一个类似字典的对象,包含所有上传文件
COOKIES 一个标准的python字典,包含所有cookie,键和值都是字符串。
session 一个即可读,又可写的类似字典的对象,表示当前你的会话,只有当Django启用会话支持时才可用,详细内容见‘状态保持’
is_ajax() 这是一个方法,不是属性,如果请求通过xmlHttpRequest发起的,则返回ture

form标签中的‘GET’和‘POST’
在HTML中,form表单的作用是收集标签中的内容,<form>...</form> 中间可以由访问者添加类似于文本,选择,或者一些控制模块等等.然后这些内容将会被送到服务端。

一个表单必须指定两样东西:

  1. form的method参数用于设置表单的提交方式,默认使用POST.
  2. action用于设置表单的提交url,如果不写或者保持空字符串,那么将使用当前的URL.
form action="{% url 'post_test' %}" method="POST">
    {% csrf_token %}
    <input type="text" name="a"><br>
    <input type="text" name="a"><br>
    <input type="submit" value="提交">
</form>

form表单使用get方式提交的例子:

def get_test(request):
    a = request.GET.get('a')
    b = request.GET.get('b')
    print(a,b)
    return HttpResponse('数据请求成功')

可以看见在地址栏会显示参数。
form表单使用post方式提交的例子:

def post_test(request):
    # a = request.POST.get('a')
    a = request.POST.getlist('a') #当name有重名时使用getlist获取数据
    # b = request.POST.get('b')
    print(a)
    return HttpResponse('数据请求成功')

一键多值的getlist方法:
request对象的属性GET、POST都是QueryDict类型的对象
与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况

  • 方法get():
    根据键获取值,只能获取键的一个值
    如果一个键同时拥有多个值,获取最后一值
  • 方法getlist():
    根据键获取值将键的值以列表返回
    可以获取一个键的多个值
request中GET和POST对象的属性:

GET属性:

  • QueryDict类型的对象
  • 包含get请求方式的所有参数
  • 与url请求地址中的参数对应,位于?后面
  • 参数的格式是键值对,如key1=value1
  • 多个参数之间,使用&连接,如key1=value1&key2=value2
    POST属性:
  • QueryDict类型的对象
  • 包含post请求方式的所有参数
  • 与form表单中的控件对应
  • 表单中控件要有name属性,则name属性的值为键,value属性的值为值,构成键值对提交
  • 对于checkbox控件,name属性一样为一组,当控件被选中后会被提交,存在一键多值的情况.
GET和POST请求方式总结:
  1. GET:GET如其名,是从服务器获取数据,不会更改服务器的状态和数据,在URL中携带参数发送给服务器。
  2. POST则是将一定量的数据发送给服务器,一般会更改服务器的数据。
  3. POST方法的参数不能在URL当中看到,他是通过body参数传递给服务器的,所以相对GET方法直接能在URL当中看到传递的参数,显得更加安全一些.当然,也不能简单的判定POST方法比GET方法更安全,要使网站保持安全,需要做更多的安全处理.

类视图:

View类视图以请求方式为类方法.
在对应的方式下面编写对应的逻辑函数.

from django.views import View

class BlogAdd(View):
    def get(self,request):
        return render(request,'blog/blog_add.html')
    def post(self,request):
        title = request.POST.get('title')
        content = request.POST.get('content')
        print(title, content)
        blog = BlogModel(title=title, zcontent=content)
        blog.save()
        return redirect(reverse('cls_add'))

就是将视图中的方法以类的方式书写逻辑。
View类视图的引用.
在url.py中配置路由是通过: as_view()

path('cls_add',views.BlogAdd.as_view(),name='cls_add'),

文件上传:

Django在处理文件上传的时候,文件数据被保存在了request.FILES,FILES中的每个键为<input type="file" name="" />中的name
设置文件的存储路径:
1.在项目根目录下static中创建media文件夹
2.图片上传后,会被保存到“/static/media/文件”
3.打开settings.py文件,增加media_root项

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]
MEDIA_ROOT = [os.path.join(BASE_DIR,'static/media')]

FILES只有在请求的方法为POST 且提交的<form>带有enctype="multipart/form-data" 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象

<form action="{% url 'post_test' %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="file"><br>
    <input type="submit" value="上传">
</form>

文件上传视图函数:

import os
from llxw.settings import MEDIA_ROOT #此处的llxw是主项目

def loadup(request):
    if request.method == "GET":
        return HttpResponse('GET 请求,无数据传回')
    elif request.method == 'POST':
        f1 = request.FILES['file']
        f1_name = os.path.join(MEDIA_ROOT,f1.name)
        with open(f1_name,'wb') as ff:
            for c in f1.chunks():
                ff.write(c)
        return HttpResponse('数据接受完成')
    else:
        return HttpResponse('Error')

HttpResponse对象:

属性 描述
content 表示返回的内容,字符串类型
charset response采用编码字符集,字符串类型
status_code 响应http的响应状态码
content-type 指输出的MIME型
方法 描述
init 使用页面内容实例化httprespose对象
write(content) 以文件的方式写
flush 以文件的方式输出缓存区
set_cookie(key,value='',max_age=none,expires=none) 设置cookie
key,value 字符串类型
max_age= 是一个整数,表示指定秒数后过期
expires 是一个datetime或timedelta对象,会话将在这个指定日期/时间过期,注意,datetime和timedelta值只有在使用PickleSerialize时才可序列化 _cookie
max_age 与expires 二选一,如果不指定过期时间,关闭浏览器就失效。
delete_cookie(key) 删除指定可以的cookie,如果key不存在,则什么也不发生。

HttpResponse的子类:
返回数据的响应函数有:
HttpResponse() 返回简单的字符串对象
render() 渲染模板
redirect() 重定向
JsonResponse() 返回json数据

from django.http import JsonResponse
def Jh(request):
   return JsonResponse({'s':123})
  • 帮助用户创建JSON编码的响应
  • 参数data是字典对象
  • JsonResponse的默认Content-Type为application/json

HTTP协议:
HTTP(超文本传输协议)是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。



客户端和服务器都是怎么记录登录的状态的呢?
浏览器中的----cookie:(请自行查找)
注意:设置cookie值以及删除cookie值都是response对象的操作,而获取cookie是从requeset相应中获得的.

import datetime

def set_ck(request):
    response = HttpResponse('设置Cookie')
    # response.set_cookie('name','taka')
    # response.set_cookie('name','taka',max_age=100)
    response.set_cookie('name','taka',expires=datetime.datetime(2019,7,6))
    return response

def get_ck(request):
    cookis = request.COOKIES
    print(cookis.get('name'))
    return HttpResponse('获取cookie')

def delete_ck(request):
    rs = HttpResponse('删除cookie')
    rs.delete_cookie('name')
    return rs

虽然cookie可以保存状态,但注意不要存储敏感信息.

相关文章

网友评论

      本文标题:Django请求与响应(request)与(response)

      本文链接:https://www.haomeiwen.com/subject/gaxehctx.html