python - 为什么 Django 不允许使用上下文重定向

标签 python django django-forms django-templates django-views

this question可以清楚地看出和接受的答案,使用上下文重定向的唯一方法是将其保存在 session 中。为什么 Django 没有像 render 那样采用一个简单的 redirect 方法来获取上下文对象?

例如,假设我有一个接受 GETPOST 请求的登录 View 。 GET 请求只是呈现用户可以输入凭据的表单,这将触发对同一 View 的 POST 调用。

def login(request, *args, **kwargs):
    if request.method == 'GET':
        context = {}
        context.update(csrf(request))
        return render(request, 'login.html', context=context)
    elif request.method == 'POST':
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = auth.authenticate(username=username, password=password)
        if user is not None:
            auth.login(request, user)
            return redirect('loggedin')
        else:
            # Redirect with a context object that has 'error':True, 
            # so that the login template can display error message:
            # 'Username/password is incorrect'
            redirect('login')

    return redirect('invalid')

请注意,在输入错误的用户名/密码组合时,我想将用户重定向到同一登录页面,并在上下文中设置错误变量,以便模板可以发出警告。

我知道,一个可能的答案是使用自定义上下文调用 render 而不是 redirect,但始终使用 redirect 并不是一个好的做法 在发布请求之后?

谢谢。

最佳答案

这绝不是 Django 的限制,而且您似乎没有考虑过它是如何工作的。

重定向是一个简单的 HTTP 响应,它告诉您的浏览器去请求另一个页面。 Django 或任何框架如何通过该重定向传递上下文?它会去哪里?接收 URL 将有自己的 View ,这将生成自己的上下文 - 它会如何处理“重定向”上下文?它怎么知道?

但无论如何,我不明白为什么您会在出现错误时重定向回同一页面。只需重新显示它即可。 Redirect-after-POST 原则适用于成功的帖子,而不是不成功的帖子。

关于python - 为什么 Django 不允许使用上下文重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29482901/

相关文章:

python - Xlsxwriter,仅格式化某些单元格,而不是整行或整列?

javascript - {{csrf_token}} 给我 403 Forbidden 和 {%csrf_token%} 给我 500 服务器错误

python - Chatterbot Django 和 Heroku(运行示例的问题)

python - 为什么 error_messages 在元类中不起作用?

python - 无法使用绝对路径导入

python - 在anaconda上的python脚本中指定hdfs目录的路径

python - 如何停止 celery worker 进程

django - 这种中间人攻击是如何工作的?

django - 在 form.cleaned_data 中删除了动态添加的表单字段

django - 为什么 form.is_valid() 会更新 Django ModelForms 的相关模型?