from django.conf.urls import url
from django.contrib import admin
####### TemplateView方法处理静态文件 #######
from django.views.generic import TemplateView
import xadmin
import crispy_forms
urlpatterns = [
url(r'^xadmin/', xadmin.site.urls),
#####TemplateView.as_view将html转换成view,利用name方法指明页面名称
url(r'^$',TemplateView.as_view(template_name='index.html'),name='index'),
]
#配置静态文件路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
urlpatterns = [
url(r'^xadmin/', xadmin.site.urls),
url(r'^$',TemplateView.as_view(template_name='index.html'),name='index'),
url(r'^login/$', TemplateView.as_view(template_name='login.html'), name='login'),
]
if request.method == "POST":
elif request.method == "GET":
from django.contrib.auth import authenticate,login
#加入后台逻辑,对用户登陆进行判断
#get函数后面的''是默认值
user_name = request.POST.get('username','')
pass_word = request.POST.get('password','')
#使用authenticate对用户正确性进行简单判断,判断正确返回user 的对象,如果错误返回None
user = authenticate(username = user_name,password = pass_word)
if user is not None:
#调用login函数,实现对request进行操作,将用户信息、session、cookies等写入了request中,再用render将request进行返回
login(request,user)
return render(request, 'index.html', {})
else:
return render(request, 'login.html', {})
{% csrf_token %}
#自定义后台auth认证方法-->>> 通过邮箱或者用户名登录
# ①在settings.py文件中重载变量(必须重载该变量)
AUTHENTICATION_BACKENDS = (
'users.views.CustomBackend', # 自定义类
)
# ②自定义认证方法
from django.contrib.auth.backends import ModelBakend
# UserProfile是用户表
from .models import UserProfile
# 将这个类配置到settings.py文件中
from django.db.models import Q
class CustomerBackend(ModelBackend):
# 传入两个关键词参数
def authenticate(self, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
# 存在数据库的用户名是加密的,所有不能get
# 通过user中的check_password()方法,检测密码是否正确
if user.check_password(password):
# 用户名密码正确,返回user对象
return user
# 如果get不到数据,或者多个数据,就返回异常
except Exception as e:
return None
#判断登陆成功与否返回不一样的头部文件
{% if request.user.is_authenticated %}
返回登陆成功的头部元素
{% else %}
返回未登陆成功的头部元素
{% endif %}
class LoginView(View):
def get(self,request):
return render(request,'login.html',{})
def post(self,request):
user_name = request.POST.get('username', '')
pass_word = request.POST.get('password', '')
# 使用authenticate对用户正确性进行简单判断,判断正确返回user 的对象,如果错误返回None
user = authenticate(username=user_name, password=pass_word)
if user is not None:
# 调用login函数,实现对request进行操作,将用户信息、session、cookies等写入了request中,再用render将request进行返回
login(request, user)
return render(request, 'index.html', {})
else:
# 账号密码有问题时
return render(request, 'login.html', {"msg": "账号密码有问题"})
url(r'^login/$', LoginView.as_view(), name='user_login'),
from django import forms
class LoginForm(forms.Form):
#字段名称一定要对应
username = forms.CharField(required=True)
password = forms.CharField(required=True,min_length=5)
class LoginView(View):
def get(self,request):
print('get')
return render(request,'login.html',{})
def post(self,request):
login_form = LoginForm(request.POST)
#返回报错值,有报错则valid为False,没报错则为True,减少服务器查询压力。
if login_form.is_valid():
user_name = request.POST.get('username', '')
pass_word = request.POST.get('password', '')
print('post')
# 使用authenticate对用户正确性进行简单判断,判断正确返回user 的对象,如果错误返回None
user = authenticate(username=user_name, password=pass_word)
if user is not None:
# 调用login函数,实现对request进行操作,将用户信息、session、cookies等写入了request中,再用render将request进行返回
login(request, user)
return render(request, 'index.html', {})
else:
# 账号密码有问题时
return render(request, 'login.html', {"msg": "账号密码有问题"})
class LoginView(View):
def get(self,request):
return render(request,'login.html',{})
def post(self,request):
login_form = LoginForm(request.POST)
#返回报错值,有报错则valid为False,没报错则为True,减少服务器查询压力。
if login_form.is_valid():
user_name = request.POST.get('username', '')
pass_word = request.POST.get('password', '')
# 使用authenticate对用户正确性进行简单判断,判断正确返回user 的对象,如果错误返回None
user = authenticate(username=user_name, password=pass_word)
if user is not None:
# 调用login函数,实现对request进行操作,将用户信息、session、cookies等写入了request中,再用render将request进行返回
login(request, user)
return render(request, 'index.html', {})
else:
# 通过了form表单的验证,但是账号密码不正确时
return render(request, 'login.html', {"msg": "账号密码有问题"})
else:
# form表单验证不通过,返回表单错误信息
return render(request, 'login.html', {"login_form": login_form}) #直接传入login_form,在Template里面调用error值
{% for key,error in login_form.errors.items %}{{ error }}{% endfor %}{{ msg }}
cookies是将数据以键值对的形式存储在本地,有安全风险。
sessions是以sessionsID的形式将用户信息存储在本地,在服务器端同时也存储sessionsKey,当浏览器post的sessions与服务器的sessions对应的时候,服务器冲数据库中的sessionsData中解密并实现取出用户信息,认可用户的登陆状态,实现登陆。
简单理解cookies是本地,sessions是云端。