Python中Django框架如何限制URL的请求方式?类似Flask的app.route('/', methods=['POST'])

Python中Django框架如何限制URL的请求方式?类似Flask的app.route(’/’, methods=[‘POST’])

8 回复

django rest framework 有类似 flask 写法,也可以通过在 View 类定义请求方法来限制


在Django里限制URL的请求方式,主要是在视图函数或类视图上做文章,和Flask的装饰器方式不太一样。Django的URL配置(urls.py)本身不处理这个,它只管路由。

1. 使用装饰器(最像Flask的方式) Django内置了require_http_methods等装饰器,可以直接用在函数视图上。

from django.http import HttpResponse
from django.views.decorators.http import require_http_methods

@require_http_methods(["POST"]) # 只允许POST
def my_view(request):
    # 你的处理逻辑
    if request.method == 'POST':
        return HttpResponse("POST请求成功")
    # 由于装饰器,GET等请求根本不会执行到这里

2. 在视图函数里手动判断(最直接) 自己写个判断,虽然土但很清晰。

from django.http import HttpResponse, HttpResponseNotAllowed

def my_view(request):
    if request.method == 'POST':
        # 处理POST逻辑
        return HttpResponse("POST请求成功")
    else:
        # 返回405 Method Not Allowed
        return HttpResponseNotAllowed(['POST'])

3. 使用类视图(更Django的方式)django.views.View,重写对应的HTTP方法函数。比如只允许POST,就只定义post方法。

from django.http import HttpResponse
from django.views import View

class MyView(View):
    def post(self, request, *args, **kwargs):
        # 只处理POST请求
        return HttpResponse("POST请求成功")
    # 不定义get()等方法,Django会自动返回405

4. 使用django.views.decorators.http里的其他装饰器 还有一些现成的:

  • require_GET: 只允许GET
  • require_POST: 只允许POST
  • require_safe: 只允许GET和HEAD

用起来和第一个例子一样。

总结一下: 想简单像Flask就用@require_http_methods装饰器;想用Django的经典风格就上类视图,只定义你需要的方法。

你不在 view 里写 post 接收方法不就完了

<br>(['GET'])<br>

view 里:

if request.method == ‘POST’:
post = request.POST

<br>class TestView(View):<br> def get(self, request):<br> ......<br> def post(self, request):<br> ......<br>

from django.views.decorators.http import require_POST, require_GET


def query():
pass


def add():
pass

回到顶部