Django学习-第十一讲(下):视图高级(一)网页请求限制、HttpRequest、HttpResponse、JsonResponse对象

1. 网页常用的请求method

  • 1.GET请求:
    GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改。比如向服务器获取某篇文章的详情。

  • 2.POST请求:
    POST请求一般是用来向服务器提交数据,会对服务器的状态进行更改。比如提交一篇文章给服务器。

2. 限制请求装饰器

Django内置的视图装饰器可以给视图提供一些限制。比如这个视图只能通过GET的method访问等。以下将介绍一些常用的内置视图装饰器

  • 1.django.views.decorators.http.require_http_methods
    这个装饰器需要传递一个允许访问的方法的列表
from django.views.decorators.http import require_http_methods

@require_http_methods(["GET"])
def my_view(request):
    pass
  • 2.django.views.decorators.http.require_GET
    这个装饰器相当于是require_http_methods(['GET'])的简写形式,只允许使用GET的method来访问视图
from django.views.decorators.http import require_GET

@require_GET
def my_view(request):
    pass
  • 3.django.views.decorators.http.require_POST
    这个装饰器相当于是require_http_methods(['POST'])的简写形式,只允许使用POST的method来访问视图
from django.views.decorators.http import require_POST

@require_POST
def my_view(request):
    pass
  • 4.django.views.decorators.http.require_safe
    这个装饰器相当于是require_http_methods(['GET','HEAD'])的简写形式,
    只允许使用相对安全的方式来访问视图。因为GET和HEAD不会对服务器产生增删改的行为
from django.views.decorators.http import require_safe

@require_safe
def my_view(request):
     pass

3. 页面重定向

重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。

    1. 永久性重定向:
      http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com的时候,会被重定向到www.jd.com,因为jingdong.com这个网址已经被废弃了,被改成jd.com,所以这种情况下应该用永久重定向。
    1. 暂时性重定向:
      http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。

在Django中,重定向是使用redirect(to, *args, permanent=False, **kwargs)来实现的。to是一个urlpermanent代表的是这个重定向是否是一个永久的重定向,默认是False

from django.shortcuts import reverse,redirect
def profile(request):
    if request.GET.get("username"):
        return HttpResponse("%s,欢迎来到个人中心页面!")
    else:
        return redirect(reverse("user:login"))

4. HttpRequest 对象

4.1 WSGIRequest对象

Django在接收到http请求之后,会根据http请求携带的参数以及报文信息创建一个WSGIRequest对象,并且作为视图函数第一个参数传给视图函数。也就是我们经常看到的request参数。在这个对象上我们可以找到客户端上传上来的所有信息。这个对象的完整路径是django.core.handlers.wsgi.WSGIRequest

4.2 WSGIRequest对象常用属性

WSGIRequest对象上大部分的属性都是只读的。因为这些属性是从客户端上传上来的,没必要做任何的修改。

  1. path:请求服务器的完整“路径”,但不包含域名和参数。比如http://www.baidu.com/xxx/yyy/,那么path就是/xxx/yyy/

  2. method:代表当前请求的http方法。比如是GET还是POST

  3. GET:一个django.http.request.QueryDict对象。操作起来类似于字典。这个属性中包含了所有以?xxx=xxx的方式上传上来的参数。

  4. POST:也是一个django.http.request.QueryDict对象。这个属性中包含了所有以POST方式上传上来的参数。

  5. FILES:也是一个django.http.request.QueryDict对象。这个属性中包含了所有上传的文件。

  6. COOKIES:一个标准的Python字典,包含所有的cookie,键值对都是字符串类型。

  7. session:一个类似于字典的对象。用来操作服务器的session

  8. META:存储的客户端发送上来的所有header信息。

  9. CONTENT_LENGTH:请求的正文的长度(是一个字符串)。

  10. CONTENT_TYPE:请求的正文的MIME类型。

  11. HTTP_ACCEPT:响应可接收的Content-Type。

  12. HTTP_ACCEPT_ENCODING:响应可接收的编码。

  13. HTTP_ACCEPT_LANGUAGE: 响应可接收的语言。

  14. HTTP_HOST:客户端发送的HOST值。

  15. HTTP_REFERER:在访问这个页面上一个页面的url。

  16. QUERY_STRING:单个字符串形式的查询字符串(未解析过的形式)。

  17. REMOTE_ADDR:客户端的IP地址。如果服务器使用了nginx做反向代理或者负载均衡,那么这个值返回的是127.0.0.1,这时候可以使用HTTP_X_FORWARDED_FOR来获取,所以获取ip地址的代码片段如下:

```
if request.META.has_key('HTTP_X_FORWARDED_FOR'):  
      ip =  request.META['HTTP_X_FORWARDED_FOR']  
  else:  
      ip = request.META['REMOTE_ADDR']

```
  1. REMOTE_HOST:客户端的主机名。
  2. REQUEST_METHOD:请求方法。一个字符串类似于GET或者POST
  3. SERVER_NAME:服务器域名。
  4. SERVER_PORT:服务器端口号,是一个字符串类型。

4.3 WSGIRequest对象常用方法

  1. is_secure():是否是采用https协议。
  2. is_ajax():是否采用ajax发送的请求。原理就是判断请求头中是否存在X-Requested-With:XMLHttpRequest
  3. get_host():服务器的域名。如果在访问的时候还有端口号,那么会加上端口号。比如www.baidu.com:9000
  4. get_full_path():返回完整的path。如果有查询字符串,还会加上查询字符串。比如/music/bands/?print=True
  5. get_raw_uri():获取请求的完整url

5.HttpResponse对象

Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest对象传给视图函数。那么视图函数在处理完相关的逻辑后,也需要返回一个响应给浏览器。而这个响应,我们必须返回HttpResponseBase或者他的子类的对象。而HttpResponse则是HttpResponseBase用得最多的子类

5.1 HttpResponse常用属性

1.content:返回的内容。

response = HttpResponse()
response.content = "首页"
return response

2.status_code:返回的HTTP响应状态码。

3.content_type:返回的数据的MIME类型,默认为text/html。浏览器会根据这个属性,来显示数据。如果是text/html,那么就会解析这个字符串,如果text/plain,那么就会显示一个纯文本。常用的Content-Type如下:

- text/html(默认的,html文件)
- text/plain(纯文本)
- text/css(css文件)
- text/javascript(js文件)
- multipart/form-data(文件提交)
- application/json(json传输)
- application/xml(xml文件)

4.设置请求头
response['X-Access-Token'] = 'xxxx'。

5.2 常用方法

  • 1.set_cookie:用来设置cookie信息。

  • 2.delete_cookie:用来删除cookie信息。

  • 3.write:HttpResponse是一个类似于文件的对象,可以用来写入数据到数据体(content)中。

6. JsonResponse类

用来对象dump成json字符串,然后返回将json字符串封装成Response对象返回给浏览器。并且他的Content-Type是application/json。

from django.http import JsonResponse
def index(request):
    return JsonResponse({"username":"juran","age":18})

默认情况下JsonResponse只能对字典进行dump,如果想要对非字典的数据进行dump,那么需要给JsonResponse传递一个safe=False参数。

from django.http import JsonResponse
def index(request):
    persons = ['张三','李四','王五']
    return JsonResponse(persons)

以上代码会报错,应该在使用HttpResponse的时候,传入一个safe=False参数,列表和元组在最终页面解析的时候都会解析成列表。

return JsonResponse(persons,safe=False,json_dumps_params={'ensure_ascii':False})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容