热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

django复习-3-请求与响应

一、请求request前端向后端传递参数有几种方式?提取URL的特定部分,如weatherbeijing2018,可以在服务器端的路由中用正则表达式截取;http:127

一、请求request

 前端向后端传递参数有几种方式?

  • 提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取; "http://127.0.0.1/weather/beijing/2018"
  • 查询字符串(query string),形如key1=value1&key2=value2; "http://127.0.0.1/weather/?area=beijing&year=2018"
  • 请求体(body)中发送的数据,比如表单数据、json、xml; "POST方法的请求体中"
  • 在http报文的头(header)中。

1.URL路径传参

任何一种请求方式都可以通过路径传参 POST  GET PUT  DELETE 

命名参数按定义顺序传递,如

urlpatterns = [
    url(r'^weather/([a-z]+)/(\d{4})/$', views.weather)
]


def weather(request, city, year):
    return HttpResponse("您查询的城市是%s年份是%s" % (city, year))

直接在url路径里写入参数,后端在匹配路由的时候,通过正则的方式提取到参数,在视图函数中,按照顺序来传入参数

命名参数按名字传递,如

urlpatterns = [
    url(r'^weather/(?P[a-z]+)/(?P\d{4})/$', views.weather),
]


def weather(request, year, city):
    return HttpResponse("您查询的城市是%s年份是%s" % (city, year))

命名参数在往视图函数中传递的时候不用在意传入的顺序,但是传入的参数名字要和正则里保持一致

2.查询字符串传参

获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。

# 请求地址 http://127.0.0.1:8000/qs/?a=aaa&b=bbb&a=a2222
def qs(request):
    query_dict = request.GET
    a = query_dict.get('a')
    b = query_dict.get('b')
    alist = query_dict.getlist('a')

    print(a, b, alist)
    # a2222 bbb ['aaa', 'a2222']
    return HttpResponse("OK")


# url配置
urlpatterns = [
    url(r'^qs/$', views.qs),
]

可以看出,当查询字符串中有多个相同名字的参数时,如果调用get方法,获取的是最后一个的值,getlist方法返回的是一个列表

重要:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。

使用postman来进行post请求,需要先在settings配置文件中关闭CSRF中间件

3.请求体传参

请求体数据格式不固定,可以是表单类型字符串,可以是JSON字符串,可以是XML字符串,应区别对待。

可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE

 Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件

3.1表单类型 Form Data

前端发送的表单类型的请求体数据,可以通过request.POST属性获取,返回QueryDict对象。

重要:request.POST只能用来获取POST方式的请求体表单数据。

演示

def qs(request):
    query_dict = request.GET
    a = query_dict.get('a')
    b = query_dict.get('b')
    alist = query_dict.getlist('a')

    print("查询字符串是分别是%s,%s,%s" % (a, b, alist))

    post_dict = request.POST

    c_post = post_dict.get('c')
    d_post = post_dict.get('d')
    c_list = post_dict.getlist('c')
    print("表单数据是分别是%s,%s,%s" % (c_post, d_post, c_list))

    return HttpResponse("OK")

同时可以用request.GET和request.POST

3.2非表单类型

非表单类型的请求体数据,Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。

def json_view(request):
    json_bytes = request.body

    req_dict = json.loads(json_bytes.decode())

    a = req_dict.get("a")
    b = req_dict.get("b")

    return HttpResponse("获取到a是%s,b是%s" % (a, b))

python3.6版本以后,json.loads()既能接受bytes类型,也能接受str类型,但是3.6之前的版本,只能接受str类型,所以如果是python3.6以前的版本,decode()一下就好

3.3请求头

可以通过request.META属性获取请求头headers中的数据,request.META为字典类型。

常见的请求头如:

CONTENT_LENGTH – The length of the request body (as a string).
CONTENT_TYPE – The MIME type of the request body.
HTTP_ACCEPT – Acceptable content types for the response.
HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.
HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.
HTTP_HOST – The HTTP Host header sent by the client.
HTTP_REFERER – The referring page, if any.
HTTP_USER_AGENT – The client’s user-agent string.
QUERY_STRING – The query string, as a single (unparsed) string.
REMOTE_ADDR – The IP address of the client.
REMOTE_HOST – The hostname of the client.
REMOTE_USER – The user authenticated by the Web server, if any.
REQUEST_METHOD – A string such as "GET" or "POST".
SERVER_NAME – The hostname of the server.
SERVER_PORT – The port of the server (as a string).

具体使用

def get_headers(request):
    print(request.META['CONTENT_TYPE'])
    return HttpResponse('OK')

4.其他常用HttpRequest对象属性

  • method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
  • user:请求的用户对象。
  • path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
  • encoding:一个字符串,表示提交的数据的编码方式。
    • 如果为None则表示使用浏览器的默认设置,一般为utf-8。
    • 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
  • FILES:一个类似于字典的对象,包含所有的上传文件。

二、响应

视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建HttpResponse对象由开发人员创建

1.HttpResponse

可以使用django.http.HttpResponse来构造响应对象。

HttpResponse(cOntent=响应体, content_type=响应体数据类型, status=状态码)

 演示

def response(request):

    s = '{"name": "zhangsan", "age": 21}'

    return HttpResponse(s, content_type='application/json', status=200)

# url配置
urlpatterns = [
    url(r'^resp$', views.response),
]

也可通过HttpResponse对象属性来设置响应体、状态码:

  • content:表示返回的内容。
  • status_code:返回的HTTP响应状态码。
def response(request):

    resp = HttpResponse()
    resp.content = "hello world!"
    resp.status_code = 200
    resp["It"] = "hello"
    
    return resp

其实就是在实例化对象之后,再设置响应体和状态码

设置响应头的方法就是 resp["It"] = "hello"

HttpResponse子类

Django提供了一系列HttpResponse的子类,可以快速设置状态码

  • HttpResponseRedirect 301
  • HttpResponsePermanentRedirect 302
  • HttpResponseNotModified 304
  • HttpResponseBadRequest 400
  • HttpResponseNotFound 404
  • HttpResponseForbidden 403
  • HttpResponseNotAllowed 405
  • HttpResponseGone 410
  • HttpResponseServerError 500

JsonResponse

若要返回json数据,可以使用JsonResponse来构造响应对象,作用:

  • 帮助我们将数据转换为json字符串
  • 设置响应头Content-Type为 application/json
from django.http import JsonResponse

def demo_view(request):
    return JsonResponse({'city': 'beijing', 'subject': 'python'})

redirect重定向

from django.shortcuts import redirect

def demo_view(request):
    return redirect('/index.html')

COOKIE,有时也用其复数形式COOKIEs,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。COOKIE最早是网景公司的前雇员Lou Montulli在1993年3月的发明。COOKIE是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将COOKIE的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该COOKIE给服务器(前提是浏览器设置为启用COOKIE)。COOKIE名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等。服务器可以利用COOKIEs包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。COOKIEs最典型记住用户名。

COOKIE是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用。

COOKIE的特点

  • COOKIE以键值对的格式进行信息的存储。
  • COOKIE基于域名安全,不同域名的COOKIE是不能互相访问的,如访问qq.com时向浏览器中写了COOKIE信息,使用同一浏览器访问baidu.com时,无法访问到qq.com写的COOKIE信息。
  • 当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有COOKIE信息提交给网站服务器。

设置COOKIE

可以通过HttpResponse对象中的set_COOKIE方法来设置COOKIE。

HttpResponse.set_COOKIE(COOKIE名, value=COOKIE值, max_age=COOKIE有效期)
  • max_age 单位为秒,默认为None。如果是临时COOKIE,可将max_age设置为None。

示例:

def set_COOKIE(request):
    resp = HttpResponse("设置COOKIE")
    resp.set_COOKIE("name","zhangsan") # 这是一个临时的COOKIE,退出浏览器就没了
    resp.set_COOKIE("name2", "lisi", max_age=3600) # 有效期一个小时的COOKIE
    return resp

# url配置

urlpatterns = [
    url(r'^COOKIE/$', views.set_COOKIE),
]

效果

上面的这个是临时COOKIE

上面的这个是有效期一小时的COOKIE

读取COOKIE

可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的COOKIE值。request.COOKIES为字典类型。

def look(request):
    name2 = request.COOKIES.get("name2")
    return HttpResponse("name2的值是%s" % name2)

效果

这时候去看还有没有name这个COOKIE

发现只有这两个

Session

启用Session

Django项目默认启用Session。

可以在settings.py文件中查看,如图所示

session是什么意思

COOKIE是存在前端的,session是存在后端的,那么session是存在哪呢

session可以存放在数据库中、本地缓存(程序的运行内存中,全局变量)、文件里、redis里

Django的session存储方式

在settings.py文件中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等。

数据库

存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式。

SESSION_ENGINE='django.contrib.sessions.backends.db'

如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用。

数据库中的表如图所示

表结构是

由表结构可知,操作Session包括三个数据:键,值,过期时间。

本地缓存

存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。

SESSION_ENGINE='django.contrib.sessions.backends.cache'

存储在本机内存中的话,如果程序重新启动,那么之前的session就都没了

混合存储

优先从本机内存中存取,如果没有则从数据库中存取。

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

本地缓存跨机问题

 

服务器肯定不只是一个服务器,如果使用本地存储来存放session的话,用户在第一台服务器登陆,然后session存储在第一台服务器了,如果第二次访问的时候,nginx把用户分到了第二台服务器上,那么第二台服务器上没有存储用户的session,会造成用户还需要登陆,所以为了解决这个问题,就需要使用redis来存储session

使用django-redis保存session

在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。

安装扩展

 

pip install django-redis

 

在settings.py文件中做如下设置

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

上面的配置信息放在settings文件的最后

设置session

def session(request):
    request.session['name'] = "zhangsan"
    request.session['age'] = 21
    return HttpResponse("设置session成功")

# url配置
urlpatterns = [
    url(r'^session$', views.session),
]

发现有数据,这个keydjango-redis自动生成的。

 

Session操作

通过HttpRequest对象的session属性进行会话的读写操作。

 

 

1) 以键值对的格式写session。

request.session['键']=值

2)根据键读取值。

request.session.get('键',默认值)

3)清除所有session,在存储中删除值部分。

request.session.clear()

4)清除session数据,在存储中删除session的整条数据。

request.session.flush()

5)删除session中的指定键及值,在存储中只删除某个键及对应的值。

del request.session['键']

6)设置session的有效期

request.session.set_expiry(value)
  • 如果value是一个整数,session将在value秒没有活动后过期。
  • 如果value为0,那么用户session的COOKIE将在用户的浏览器关闭时过期。
  • 如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。

推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
author-avatar
俺是胖墩墩_499
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有