sign-up:1 无法加载资源:服务器响应状态为 500(内部服务器错误)

sign-up:1 Failed to load resource: the server responded with a status of 500 (Internal Server Error)

提问人:mangesh vispute 提问时间:11/12/2023 最后编辑:Peter Mortensenmangesh vispute 更新时间:11/15/2023 访问量:83

问:

在此处输入图像描述

我在 Django 注册页面上收到内部服务器错误 (500)。如何解决is_ajax属性问题?

描述:

我目前正在处理一个 Django 项目,并在注册页面上遇到内部服务器错误 (500)。经过一番调查,它似乎与 views.py 文件中的 is_ajax 属性有关。我在下面提供了相关的代码片段和回溯供您查看。

文件 views.py

class SignUpView(AjaxFormMixin, FormView):
    '''
    Generic FormView with our mixin for user sign-up with reCAPTCHA security
    '''

    template_name = "users/sign_up.html"
    form_class = UserForm
    success_url = "/"

    # reCAPTURE key required in context
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["recaptcha_site_key"] = settings.RECAPTCHA_PUBLIC_KEY
        return context

    # Overwrite the mixin logic to get, check and save reCAPTURE score
    def form_valid(self, form):
        response = super(AjaxFormMixin, self).form_valid(form)
        if self.request.is_ajax():
            token = form.cleaned_data.get('token')
            captcha = reCAPTCHAValidation(token)
            if captcha["success"]:
                obj = form.save()
                obj.email = obj.username
                obj.save()
                up = obj.userprofile
                up.captcha_score = float(captcha["score"])
                up.save()

                login(self.request, obj, backend='django.contrib.auth.backends.ModelBackend')

                # Change result & message on success
                result = "Success"
                message = "Thank you for signing up"

            data = {'result': result, 'message': message}
            return JsonResponse(data)

        return response

文件 urls.py

from django.urls import path
from . import views

app_name = "users"
urlpatterns = [
    path('', views.AccountView.as_view(), name="account"),
    path('profile', views.profile_view, name="profile"),
    path('sign-up', views.SignUpView.as_view(), name="sign-up"),
    path('sign-in', views.SignInView.as_view(), name="sign-in"),
    path('sign-out', views.sign_out, name="sign-out"),
]

文件sign_up.html

{% extends 'base.html' %}
{% load static %}

{% block extend_head %}
<script src='https://www.google.com/recaptcha/api.js?render={{recaptcha_site_key}}'></script>
{% endblock %}

{% block content %}
<h3>Django Google API Course - Sign Up</h3>

<div class="container">
  <form id="signupform" method="POST" action="/sign-up">
    {% csrf_token %}

    <label for="first_name">First Name</label>
    {{form.first_name}}

    <label for="last_name">Last Name</label>
    {{form.last_name}}

    <label for="username">Username</label>
    {{form.username}}

    <label for="password1">Password</label>
    {{form.password1}}

    <label for="password2">Confirm Password</label>
    {{form.password2}}

    {{form.token}}

    <label class="check-container">Show Passwords
     <input type="checkbox" onclick="showPword()">
     <span class="checkmark"></span>
    </label>

    <button type="submit">Sign up</button>
  </form>
</div>
{% endblock %}

{% block extend_footer %}
<script type="text/javascript">
  // Create a variable that can be used in main.js
  var recaptcha_site_key = '{{recaptcha_site_key|safe}}'
</script>
{% endblock %}


base.html
{% load static %}

<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="preconnect" href="https://fonts.gstatic.com">
  <link href="https://fonts.googleapis.com/css2?family=Courier+Prime&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="{% static 'main.css' %}"></link>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.css" integrity="sha512-3pIirOrwegjM6erE5gPSwkUzO+3cTjpnV9lexlNZqvupR64iZBnOOTiiLPb9M36zpMScbmUNIcHUqKD47M719g==" crossorigin="anonymous" referrerpolicy="no-referrer" />

  {% block extend_head %}
  {% endblock %}
</head>
<body>
  {% include 'partials/nav.html' %}
  <div class="div-container">
    {% include 'partials/logo.html' %}
    {% block content %}
    {% endblock %}
  </div>
  <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js" integrity="sha512-VEd+nq25CkR676O+pLBnDW09R7VQX9Mdiij052gVCp5yVH3jGtH70Ho/UUv4mJDsEdTvqRCFZg0NKGiojGnUCw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  {% block extend_footer %}
  {% endblock %}
  <script src="{% static 'main.js' %}"></script>
</body>
</html>
JavaScript HTML Django

评论

0赞 Chukwujiobi Canon 11/12/2023
添加错误消息而不是图像
0赞 Peter Mortensen 11/15/2023
请查看为什么在提问时不上传代码/错误的图像?(例如,“图像只能用于说明无法通过任何其他方式阐明的问题,例如提供用户界面的屏幕截图。提前致谢。

答:

0赞 Steve Yonkeu 11/12/2023 #1

溶液

您在注册页面上出现内部服务器错误 (500) 的问题似乎与在 Django 中使用 is_ajax() 方法有关。从 Django 3.1 开始,is_ajax() 已被弃用,使用它可能会导致意外错误。以下是解决此问题的方法:

替换 is_ajax()

将 is_ajax() 方法替换为自定义实现。您可以定义一个函数来检查请求是否为 AJAX 调用:


def is_ajax(request):
    return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

然后,在 SignUpView 类中使用此函数:

# ... other parts of your class ...

def form_valid(self, form):
    response = super(AjaxFormMixin, self).form_valid(form)
    if is_ajax(self.request):  # Use the custom is_ajax function
        # ... rest of your code ...

为什么会出现这个问题

is_ajax() 方法是检查请求是否为 AJAX 调用的便捷方法。但是,它被弃用了,因为在现代 Web 开发中,用于进行 AJAX 调用的 XMLHttpRequest 对象正在慢慢被 fetch API 所取代。Django 决定删除这种方法,以鼓励开发人员使用更新的技术,并且因为 is_ajax() 检查的 HTTP_X_REQUESTED_WITH 标头的值很容易被欺骗,使其对于安全敏感操作不可靠。

其他建议

检查 Django 版本:确保你的项目与你正在使用的 Django 版本兼容,尤其是 3.1 或更高版本。

服务器日志:如果此更改后问题仍然存在,请查看服务器日志以获取更具体的错误详细信息。

表单和 AJAX 请求处理:验证表单是否设置正确,以及 AJAX 请求的格式和处理是否正确。

  • 注意:当我们试图获得对问题的更多见解时,建议将 =True 转为。DEBUG

评论

0赞 Peter Mortensen 11/15/2023
这是由 ChatGPT(或类似)生成的吗?
0赞 Steve Yonkeu 11/17/2023
哦,不,不是