提问人:mangesh vispute 提问时间:11/12/2023 最后编辑:Peter Mortensenmangesh vispute 更新时间:11/15/2023 访问量:83
sign-up:1 无法加载资源:服务器响应状态为 500(内部服务器错误)
sign-up:1 Failed to load resource: the server responded with a status of 500 (Internal Server Error)
问:
我在 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>
答:
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
评论