首页 > 技术文章 > 请求与响应

chancey 2019-01-14 18:40 原文

HTTP协议:众多周知,HTTP协议就是将请求从浏览器发送到服务器,服务器接收到请求之后做出回应,这个回应就是响应,而HTTPS就是在HTTP的基础上加了SSL验证,以提高安全性,这个之前,服务处于无状态,也就是说,不管是谁访问,服务端不知道是谁访问,这就出现了cookie,能够记住每次访问的浏览器,但是cookie是明文的,对于一些敏感信息来说,并不适合,所以出现了session

一、请求

HttpReponse对象:

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

HttpResonse有很多属性可供使用

 

属性:

  • path:一个字符串,表示清求的页面的完整路径,不包含域名
  • method:一个字符串,表示清求使用的HTTP方法,常用值包括: 'GET'、 'POST'           encoding:一个字符串,表示提交的数据的编码方式如果为None则表示使用浏览器的默人设置,一般为utf-8
  • 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值
  • GET:一个类似于字典的对象,包含get请求方式的所有参数
  • POST: 一个类似于字典的対象,包含post清求方式的所有参数
  • FILES:一个类似于字典的对象,包含所有的上传文件
  • cookies:一个示准的Python字典,包合所有的cookie,键和值都是字符串
  • session:一个既可读又可写的类似于字典的对象,表示当前的会活,只有当Django启动会话的支持时オ可用

方法:

  • is_ ajax(): 如果清求是通辻XMLHttpRequest爰起的,則返回True

接下来随便写一个视图并配置路由

def test(request):
    print(request.path)
    print(request.method)
    return HttpResponse('测试')

 运行如下

 1.GET

新建一个HTML文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>请求</title>
</head>
<body>
<form action="{% url 'get_test' %}" method="get">
    <p>用户名&emsp;<input type="text" name="user"></p>
    <p>&emsp;&emsp;<input type="password" name="passwd"></p>

</form>
</body>
</html>
放置到templates

视图函数体

def test(request):
    return render(request, 'method/index.html')

def get_test(request):
    user = request.GET.get('user')
    passwd = request.GET.get('passwd')
    print(user,passwd)
    return HttpResponse('提交成功')

url

    path('test/',views.test,name='test'),
    path('get/',views.get_test,name='get_test'),

输入之后点击提交

但是跳转之后,可以发现,地址栏的url传参是明文的

 

而在后台获取 数据,就是用 request.GET.get() 

2.POST

视图

 

def post_test(request):
    if request.method == 'GET':
        return render(request,'method/index.html')
    elif request.method == 'POST':
        print(request.POST.get('user'))
        print(request.POST.get('passwd'))
        return HttpResponse('提交成功')
    else:
        return HttpResponse('无法处理')

 

URL

    path('post/',views.post_test,name='post_test')

网页文件

只需要将get改为post即可

效果

这是django自带的防止跨域攻击的措施

添加{% csrf_token %}即可

再次访问

地址栏并没有将参数明文展示

若是一键多值,也就是说标签的name属性相同,这里简单测试一下

将模板的 name="passwd" 改成 name = "user" 那么现在就有两个user,启动服务刷新一下

这里看到,输出的user变成了asd,不再是奥斯丁,后边的none不用管,是之前输出的passwd,那么就可以用 request.POST.getlist('user') 获取

是以一个列表的形式返回

请求总结

  • 1. GET:GET如其名,是从服务器获取数据,不会更改服务器的状态和数据,在URL中携带参数发送给服务器。
  • 2. POST则是将一定量的数据发送给服务器,一般会更改服务器的数据。
  • 3. POST方法的参数不能在URL当中看到,他是通过body参数传递给服务器的,所以相对GET方法直接能在URL当中看到传递的参数,显得更加安全一些.当然,也不能简单的判定POST方法比GET方法更安全,要使网站保持安全,需要做更多的安全处理.

 

二、类视图

之前都是用if来进行判断POST请求

导入 from django.views import View 

视图

class Reg(View):
    def get(self,request):
        return render(request, 'method/index.html')
    def post(self,request):
        print(request.POST.get('user'))
        print(request.POST.get('passwd'))
        return HttpResponse('提交成功')

url path('class/',views.Reg.as_view()) 

 

三、文件上传

static目录下新建media

配置  MEDIA_ROOT = os.path.join(BASE_DIR,'static/media') 

新建HTML文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
    <P><input type="file" name="file"></P>
    <P><input type="submit" value="点击上传"></P>
</form>
</body>
</html>
View Code

类视图

import os
from Hello_Django.settings import MEDIA_ROOT
class Upload(View):
    def get(self,request):
        return render(request,'method/file.html')
    def post(self,request):
        ff = request.FILES.get('file')
        ff_name = os.path.join(MEDIA_ROOT,ff.name)  #拼接路径
        with open(ff_name) as f:
            for i in ff.chunks():  #固定写法,边读边写
                f.write(i)
        return HttpResponse('XXX')

 

推荐阅读