不允许使用 Django 奇怪的方法
Posted
技术标签:
【中文标题】不允许使用 Django 奇怪的方法【英文标题】:Django weird method not allowed 【发布时间】:2013-11-14 02:58:19 【问题描述】:我在请求 url 时使用 Django 编写一个项目,我得到一个奇怪的 Not Allowed Mthod(405)。 我的错误是什么,但这里是我的实现和细节:
urls.py
url(r'^join/',
csrf_protect(UserSignUp.as_view()),
name='sgn_up'),
views.py
class UserSignUp(View):
def post(self, request):
resp_data =
try:
print 'sign up================================================'
x = MyUser.objects.get(email=request.POST['email'])
resp_data['message'] = 'signed up before'
return HttpResponse(json.dumps(resp_data), content_type="application/json")
except MyUser.DoesNotExist:
user = MyUser(email=request.POST['email'],
password=request.POST['password'],
first_name=request.POST['firstName'],
last_name=request.POST['lastName']
)
user.save()
#print 'errorize'
user.set_password(request.POST['password'])
user.save()
resp_data[
'message'] = 'please refer to your email for complete registrations'
return HttpResponse(json.dumps(resp_data), content_type="application/json")
html/JS
function csrfSafeMethod(method)
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
var csrftoken = $('input[name="csrfmiddlewaretoken"]').prop('value');
function sameOrigin(url)
var host = document.location.host; // host + port
var protocol = document.location.protocol;
var sr_origin = '//' + host;
var origin = protocol + sr_origin;
// Allow absolute or scheme relative URLs to same origin
return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
(url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
// or any other URL that isn't scheme relative or absolute i.e relative.
!(/^(\/\/|http:|https:).*/.test(url));
$.ajaxSetup(
beforeSend: function(xhr, settings)
if (!csrfSafeMethod(settings.type) && sameOrigin(settings.url))
xhr.setRequestHeader("X-CSRFToken", csrftoken);
);
function ajaxSignIn()
$.ajax(
url:"% url 'sgn_in' %",
type: "POST",
data: $('#sgn-in-form').serialize(),
dataType : "json",
success: function(json)location.reload();,
error: function(xhr, status)
);
function ajaxSignUp()
$.ajax(
url:"% url 'sgn_up' %",
type: "POST",
data: $('#sgn-up-form').serialize(),
dataType : "json",
success: function(json)location.reload();,
error: function(xhr, status)
);
现在我发送一个 ajax 请求(我已包含 csrftoken)和 post 方法,但我得到了 405! 我还有其他带有 csrftokens 的 ajax 发布请求,它们也可以正常工作(例如登录)!
最有趣的是,当我使用 Chrome 时,它会给出错误,并且用户数据也保存在数据库中!!!(这意味着模型发布方法有效!!!)但是当使用 firefox 时,它只报错! 有没有人遇到过这样的问题?我搜索了很多,但没有发现任何帮助! 谢谢
【问题讨论】:
您确定要发送 POST 请求吗? 是的,当然。我已经更新了我的问题以查看 html/js。更强调:我的 ajaxSignIn 运行良好,但注册挂断,更愚蠢:从不同浏览器的请求中查看不同的功能!!! 【参考方案1】:在您的 def 帖子中,您还必须包含上下文。
self.object = self.get_object()
context = self.get_context_data(object=self.object)
return self.render_to_response(context)`
【讨论】:
以上是关于不允许使用 Django 奇怪的方法的主要内容,如果未能解决你的问题,请参考以下文章