Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在执行自定义HTTP身份验证和方法时,什么';什么是正确的操作顺序?_Python_Django_Http - Fatal编程技术网

Python 在执行自定义HTTP身份验证和方法时,什么';什么是正确的操作顺序?

Python 在执行自定义HTTP身份验证和方法时,什么';什么是正确的操作顺序?,python,django,http,Python,Django,Http,我有一个Django应用程序,它大量使用Django.contrib.auth.decorators.login\u required()和Django.views.decorators.http.require\u http\u methods()。前者是一个decorator,它检查当前用户是否已登录,如果未登录,则将其重定向(代码302,IIRC)到登录页面。后者是一个decorator,它检查请求方法,如果方法不在传入列表中,则返回405(未实现的方法)。例如,视图函数可能如下所示: @

我有一个Django应用程序,它大量使用
Django.contrib.auth.decorators.login\u required()
Django.views.decorators.http.require\u http\u methods()
。前者是一个decorator,它检查当前用户是否已登录,如果未登录,则将其重定向(代码302,IIRC)到登录页面。后者是一个decorator,它检查请求方法,如果方法不在传入列表中,则返回405(未实现的方法)。例如,视图函数可能如下所示:

@require_http_methods(["GET", "POST", "DELETE"])
@login_required
def my_view(request):
    ...
问题是:如果用户对资源缺乏足够的权限,这些视图中的许多都会执行内部权限检查,返回403(禁止)。根据我的研究,这是不好的,因为在检查方法是否正确之前需要进行403。但是,如果没有
login\u required()
,我将不得不在视图中打开用户检查的代码


还有其他人经历过吗?有正确的答案吗?我知道这是作弊,但是检查方法,然后进行登录重定向,最后检查用户权限,或者我需要重新构造这些视图,这是不可接受的吗?

我真的不确定您订单的“正确性”,但是对于任何类型的复杂视图权限方案,我强烈建议您编写自己的自定义中间件来处理视图身份验证/权限。与其用
@login\u required
装饰每个视图,我总是在自己的中间件中处理它


您还可以编写自己的视图装饰器(可以使用参数,也可以不使用参数),并获得不同视图所需的行为。

每个视图所需的权限完全是视图专有的。中间件将不是合适的地方,装饰师也不会。我需要有一个登录的用户,我需要确信用户确实存在,并且我必须在需要登录后进行,或者我自己进行登录重定向。我只需要在中间件中实现登录重定向,然后你可以在以后(在中间件或视图中)进行任何身份验证。由于中间件总是运行,但大多数视图不需要登录,这难道不令人讨厌吗?在这里,我可以创建自己的
@no_auth
装饰器,或者您也可以从URL传递
auth=False
kwarg,中间件可以检查。我已经使用了这两种技术。通常我在几乎每个视图都需要某种类型的身份验证的项目中使用了它,所以这可能不是您的最佳解决方案。