django开发系列:视图高级之限制请求method装饰器

django开发系列:视图高级之限制请求method装饰器

常用的请求method

GET请求: 一般用来向服务器索取数据,但是不会向服务器提交数据,不会对服务器的状态进行更改。
POST请求:一般是用来向 服务器提交数据,会对服务器的状态进行更改。

限制请求装饰器

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

  1. django.views.decorators.http.require_http_methods:这个装饰器需要传递一个允许访问的方法的列表。比如只能通过GET的方式访问。那么示例代码如下:
 from django.views.decorators.http import require_http_methods

 @require_http_methods(["GET"])
 def index(request):
     pass

  1. django.views.decorators.http.require_GET:这个装饰器相当于是require_http_methods([‘GET’])的简写形式,只允许使用GET的method来访问视图。示例代码如下:
@require_GET
def index(request):
    # 首页返回所有的文章
    # 只能使用GET请求来访问这个视图函数
    articles = Article.objects.all()
    return render(request,'index.html',context={"articles":articles})
  1. django.views.decorators.http.require_POST:这个装饰器相当于是require_http_methods([‘POST’])的简写形式,只允许使用POST的method来访问视图。示例代码如下:
 from django.views.decorators.http import require_POST

 @require_POST
def add_article(request):
    title = request.POST.get("title")
    content = request.POST.get('content')
    Article.objects.create(title=title,content=content)
    return HttpResponse('success')
  1. django.views.decorators.http.require_safe:这个装饰器相当于是require_http_methods([‘GET’,‘HEAD’])的简写形式,只允许使用相对安全的方式来访问视图。因为GET和HEAD不会对服务器产生增删改的行为。因此是一种相对安全的请求方式。示例代码如下:
 from django.views.decorators.http import require_safe

 @require_safe
 def index(request):
     pass
  1. 可以使用装饰器限制请求类型,并且利用已有的类型进行各自操作
from django.shortcuts import render
from .models import Article
from django.views.decorators.http import require_http_methods,require_GET,require_POST,require_safe
from django.http import HttpResponse

@require_http_methods(['POST','GET'])
def add_article(request):
    # 如果使用GET请求来访问这个视图函数,那么就返回一个添加文章的HTML页面
    # 如果使用POST请求来访问这个视图函数,那么就获取提交上来的数据,然后保存
    # 到数据库中
    if request.method == 'GET':
        return render(request,'add_article.html')
    else:
        title = request.POST.get("title")
        content = request.POST.get('content')
        Article.objects.create(title=title,content=content)
        return HttpResponse('success')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章