2013-11-03 62 views
2


Django的怪異方法不被允許

我請求一個URL編碼時使用Django一個項目,我得到一個奇怪不允許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!
我還有其他的ajax post請求,他們也可以使用csrftokens bur(例如登錄)!

最有趣的是,當我使用Chrome瀏覽器時,它給出了錯誤,並且用戶數據也保存在數據庫中!!!(這意味着模型後期方法起作用!!!)但是當使用Firefox時只給錯誤!
有沒有人遇到過這樣的問題?我搜索了很多,但沒有發現任何幫助!
謝謝

+0

您是否確定要發送POST請求? –

+1

是的,絕對。我已經更新了我的問題以查看html/js。 更多的重點:我的ajaxSignIn運作良好,但註冊掛斷,更愚蠢:從不同瀏覽器的請求中看到不同的功能! – Mahdi

回答

0

在你的def文章中,你還必須包含上下文。

self.object = self.get_object() 
    context = self.get_context_data(object=self.object) 
    return self.render_to_response(context)`