django登录
django是一个python下的大型框架,之所以大,是因为很多东西都可以沿用。试了一下继承django自带的user类实现登录。
直接展现views.py
@sensitive_post_parameters()
@csrf_protect
@never_cache
def login(request, template_name='accounts/login.html',
redirect_field_name=REDIRECT_FIELD_NAME,
authentication_form=LoginForm,
current_app=None, extra_context=None):
"""
Displays the login form and handles the login action.
"""
redirect_to = request.POST.get(redirect_field_name,
request.GET.get(redirect_field_name, ''))
if request.method == "POST":
form = authentication_form(request, data=request.POST)
if form.is_valid():
# Ensure the user-originating redirection url is safe.
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 the user in.
auth_login(request, form.get_user())
return HttpResponseRedirect(redirect_to)
else:
form = authentication_form(request)
current_site = get_current_site(request)
context = {
'form': form,
redirect_field_name: redirect_to,
'site': current_site,
'site_name': current_site.name,
}
if extra_context is not None:
context.update(extra_context)
if current_app is not None:
request.current_app = current_app
return TemplateResponse(request, template_name, context)
其中form.py中的LoginForm如下:
class LoginForm(AuthenticationForm):
def __init__(self, *args, **kwargs):
self.user_cache = None
super(LoginForm, self).__init__(*args, **kwargs)
username = forms.CharField(label=_('用户名'), widget=forms.TextInput(attrs={'class': 'from-control',
'placeholder': '用户名'
}), error_messages={'required': u'该项必须填写'},
required=True)
password = forms.CharField(label=_('密码'), widget=forms.PasswordInput(attrs={
'class': 'form-control',
'placeholder': '密码',
}, render_value=True), error_messages={'required': u'该项必须填写'}, required=True)
error_messages = {
NON_FIELD_ERRORS: {
'invalid_login': u'用户名或密码不正确',
'inactive': u'帐号禁止登录'
}
}
def clean(self):
print '###---------ok-----clean----'
username = self.cleaned_data.get('username')
password = self.cleaned_data.get('password')
if username and password:
self.user_cache = authenticate(username=username,
password=password)
if self.user_cache is None:
raise forms.ValidationError(
self.error_messages[NON_FIELD_ERRORS]['invalid_login'],
code='invalid_login',
)
else:
self.confirm_login_allowed(self.user_cache)
return self.cleaned_data
页面上采用jinjia2模板,其中django 自带的form封装好了html。建议直接使用如: {{ form.username }} {{ form.username.errors }}{{ form.non_field_errors }}以及更多强大的功能 建议直接去看django关于form的文档。
登出
django登出的话我目前主要处理的是把session清除,然后返回到登录界面,若后续需要新功能再去添加
def logout(request):
"""
Logs out the user and displays 'You are logged out' message.
"""
auth_logout(request)
return HttpResponseRedirect('/')