jquery - Post returns 302 for ajax enabled class based view -
i have been trying basic implementation of login , logout forms through ajax in django. trying eclose standard auth login , logout ajax enabled class based view. working somereason post returning 302.
views.py
class jsonajaxview(view): template_name = none context = {} form = none context_object_name = 'context' #this tells whether yout need #return same view after post completion return_back = none redir_to = none page_load = false @method_decorator(login_required) @method_decorator(user_passes_test(privilaged_user)) @method_decorator(csrf_protect) def post(self, request): print("emp_users: ajax post") print("page_load = ", self.page_load) frm = self.form(request.post) if frm.is_valid(): frm.submit_action(request) if self.redir_to not none: if self.page_load true: return httpresponseredirect(self.redir_to) else : response_data = {} response_data['redirect'] = self.redir_to json_data = json.dumps(response_data) return httpresponse(json_data, content_type="application/json") print("emp_users post: form invalid") get(request) def get(self, request): print("emp_users: ajax get") #look view block in views , process # return json if self.form not none: print("emp ajax get: initializing form") frm = self.form() print("emp ajax get: updating context") self.context.update(frm.get_context(request)) self.context.update({'form':frm}) self.context.update(csrf(request)) if request.is_ajax(): response_data = {} page = render(request, self.template_name, self.context) print("emp ajax get: page = ", page.content) response_data['page'] = page.content.decode("utf-8") print("emp ajax get: serializing") json_data = json.dumps(response_data) return httpresponse(json_data, content_type="application/json")
forms.py
class login_form(authenticationform): def get_context(self, request): request.session.set_test_cookie() current_site = get_current_site(request) redirect_field_name = request.get_host() ctxt = {} ctxt.update({ 'dummy' : 'dummy', 'redirect_field_name' : redirect_field_name, }) return ctxt def submit_action(self, *args): redirect_to = request.request.get(redirect_field_name, '') if not is_safe_url(url=redirect_to, host=request.get_host()): redirect_to = resolve_url(settings.login_redirect_url) # okay, security check complete. log user in. auth_login(request, form.get_user()) if request.session.test_cookie_worked(): request.session.delete_test_cookie() return httpresponseredirect(redirect_to)
login.html
<script type="text/javascript" src="{{ static_url }}jquery/hr_base_nav_bar_main.js"></script> {% if form.errors %} <p>your username , password didn't match. please try again. </p> {% endif %} <form method="post" action="/emp_users/login"> {% csrf_token %} <table> <tr> <th>{{ form.username.label_tag }}</th> <td>{{ form.username }}</td> </tr> <tr> <th>{{ form.password.label_tag }}</th> <td>{{ form.password }}</td> </tr> </table> <input type="submit" value="login" /> <input type="hidden" name="redirect_field_name" value="{{ redirect_field_name }}" /> </form>
this url of view:
url(r'^logout/$', jsonajaxview.as_view(template_name='emp_users/logout.html', form=logout_form, redir_to='index', page_load=true)),
you can ignore redir_to , page_load attributes. main thing 302 post. doesn't seem enter view @ all.
here console log of django webserver:
[12/apr/2014 16:13:10] "get /emp_users/login http/1.1" 200 754 [12/apr/2014 16:13:10] "get /static/jquery/hr_base_nav_bar_main.js?_=1397299121194 http/1.1" 200 1541 [12/apr/2014 16:13:10] "get /static/jquery/hr_base_nav_bar_main.js?_=1397299121195 http/1.1" 200 1541 [12/apr/2014 16:13:10] "get /static/jquery/hr_base_nav_bar_main.js?_=1397299121196 http/1.1" 200 1541 [12/apr/2014 16:13:10] "get /static/jquery/hr_base_nav_bar_main.js?_=1397299121197 http/1.1" 200 1541 [12/apr/2014 16:13:55] "post /emp_users/login http/1.1" 302 0 emp_users: ajax emp ajax get: initializing form emp ajax get: updating context emp ajax get: page = b'<script type="text/javascript" src="http://127.0.0.1:8000/static/jquery/hr_base_nav_bar_main.js" ></script>\n\n\n<form method="post" action="/emp_users/login">\n<input type=\'hidden\' name=\'csrfmiddlewaretoken\' valu e=\'ltxsyladmdtvwwwuo1ssg13reasb9itv\' />\n\n<table>\n<tr>\n\t<th><label for="id_username">username</label></th>\n\t<td> <input id="id_username" maxlength="254" name="username" type="text" /></td>\n</tr>\n<tr>\n\t<th><label for="id_password" >password</label></th>\n\t<td><input id="id_password" maxlength="4096" name="password" type="password" /></td>\n</tr>\n< /table>\n\n<input type="submit" value="login" />\n<input type="hidden" name="redirect_field_name" value="127.0.0.1:8000" />\n</form>\n' emp ajax get: serializing [12/apr/2014 16:13:55] "get /emp_users/login?next=/emp_users/login http/1.1" 200 754
why getting 302 post ? how solve this?
because you've decorated post method user_passes_test
decorator. means need logged in post.
Comments
Post a Comment