用户模块概述
用户模块主要为用户的模型类,用户的信息,用户的登录与注册,登录验证,用户中心视图几部分
1. 建立模型类
class User(models.Model):
uname = models.CharField(max_length=20)
upwd = models.CharField(max_length=40)
uemil = models.CharField(max_length=30)
urelname =models.CharField(max_length=20,default='')
uadr = models.CharField(max_length=100,default='')
uphone = models.CharField(max_length=11,default='')
建立模型后要进行数据库迁移
2. 建立视图函数,在view.py里建
- 首先是登录和注册的视图函数
def login(request):
uname = request.COOKIES.get('uname','')
pwd = request.COOKIES.get('upwd','')
#用来获取cookie里的用户名和密码,实现自动填写信息
context = {'uname': uname,
'pwd': pwd,
'error': 0}
try:
url = request.META['HTTP_REFERER']
#获取头部的 来源地址
except:url = '/'
response = render(request, 'df_user/login.html', context)
#将请求的url存入cookie,然后登陆后跳回原来的地方
# render方法返回httpesponse方法
response.set_cookie('url', url)
# 在esponse里写入cookie
return response
def register(request):
return render(request, 'df_user/register.html')
- 登录和注册的处理函数
用来处理登录和注册的表单提交 ,以及数据的存取数据库操作,还有向cookie的写入操作
def login_handle(request):
# 接收表单数据
post = request.POST
uname = post.get('username')
upwd1 = post.get('pwd')
# 设置默认值
remember = post.get('remember', '0')
# 加密
s1 = sha1()#创建sha1对象
s1.update(upwd1.encode('utf8'))#要先编码
upwd = s1.hexdigest()
# 验证用户是否正确
user = User.objects.filter(uname=uname).filter(upwd=upwd).first();
if user:
url = request.COOKIES.get('url', '/') # 第二个参数为默认参数,如果url没有,则条首页
red = HttpResponseRedirect(url)
# 如果记住密码则将用户名和密码写入cookies
if remember == '1':
red.set_cookie('uname', user.uname)
red.set_cookie('upwd', upwd1)
else:
red.set_cookie('uname', '',max_age=-1)
red.set_cookie('upwd', '',max_age=-1)
#也应该写入session,会安全一点
# request.COOKIES['userinfo']=[user.uname,user.upwd]
#将uname和id写入session用来保持登录状态
request.session['username'] = uname
request.session['uid'] = user.id
return red
else:
#如果没有用户,怎返回错误参数,模板界面,根据错误信息给出提示
context = {'error': 1,
'uname': uname}
return render(request, 'df_user/login.html', context)
def register_handle(request):
# 接收用户输入
post = request.POST
uname = post.get('user_name')
pwd = post.get('pwd')
cpwd = post.get('cpwd')
uemail = post.get('email')
# allow = post.get('allow')
# 判断密码是否相等
if pwd != cpwd:
return redirect('/user/register')
# 密码加密
# 使用sha1加密
s1 = sha1()
# sha1加密前,要先编码为比特
s1.update(pwd.encode('utf8'))
pwd = s1.hexdigest()
# 存入数据库
user = User()
user.uname = uname
user.upwd = pwd
user.uemil = uemail
user.save()
print(user.uname)
return redirect('/user/login')
- 在注册的时候需要验证,,用户名是否存在,这里用ajax发送异步请求来判断是否存在相同用户名
js部分
function check_user_name(){
var len = $('#user_name').val().length;
if(len<5||len>20)
{
$('#user_name').next().html('请输入5-20个字符的用户名')
$('#user_name').next().show();
error_name = true;
}
else
// 发送ajax请求,检查用户名是存在
// { alert('准备发送请求');
$.get('/user/register_exist?uname='+$('#user_name').val(),function (data) {
// alert('count'+data.count);
if(data.count!=0){
$('#user_name').next().html('用户名已经存在');
//显示错误信息
$('#user_name').next().show();
error_name = true;
}else {
$('#user_name').next().hide();
error_name = false;}
})
}
;
处理函数
def register_exist(request):
uname = request.GET.get('uname') # 通过url传参的方式
count = User.objects.filter(uname=uname).count()
# print(count)
# 返回json字典,判断是存在,
return JsonResponse({'count': count})
- 注销
def logout(request):
request.session.flush() # 清空所有session
return redirect('/')
- 登录验证,很多页面如个人中心,购物车等都需要在进入视图前进行用户是否登录的验证,这正符合 装饰器 的用法,用装饰器完成登录验证
def login(func):
def login_fun(request,*args,**kwargs):
if request.session.has_key('username'):
#如果成功登录,继续执行 原函数
return func(request,*args,**kwargs)
else:
red = HttpResponseRedirect('/user/login')
#将当前页的url存入cookie
red.set_cookie('url',request.get_full_path())
return red
return login_fun
使用时只需要在视图函数前加上装饰器即可,方便
@user_decorator.login
def user_center_info(request):
pass
- 个人信息中心,用来展示自己的信息
@user_decorator.login #用验证装饰器
def user_center_info(request):
username = request.session.get('username')
user = User.objects.filter(uname=username).first()
#获取最近浏览的商品
goodids = request.COOKIES.get('goodids','')#获得 cookie存的记录
if goodids != '':
goodidsl = goodids.split(',')#拆分为列表
#这样查询可以的到所需商品,但顺序无法维护,无法为原先设定顺序
# GoodInfo.objects.filter(id__in=goodids)
goods_list = []#用来存放 商品列表,并维持顺序不变
for good_id in goodidsl:
goods = GoodInfo.objects.filter(pk=good_id).first()
goods_list.append(goods)
else:
goods_list = []
#其实可以直接传user对象
context = {'title': '用户中心', 'username': username, 'phone': user.uphone, 'adress': user.uadr,
'good_list':goods_list,'tag':1} #tag用来标记 高亮页
return render(request, 'df_user/user_center_info.html', context)
8.个人信息的收货地址页,显示地址信息和修改信息
def user_center_site(request):
username = request.session.get('username')
user = User.objects.filter(uname=username).first()
if request.method == 'POST': #当post的时候修改数据
adr = request.POST.get('area')
username = request.POST.get('user')
phone = request.POST.get('phone')
user.uadr = adr
user.uphone =phone
user.urelname = username
user.save()
context = {'adr':user.uadr,
'user':user.urelname,
'phone':user.uphone,
'tag':3}
return render(request,'df_user/user_center_site.html',context)
还有一个个人的订单页面,在订单模块讲
3. 在模板里建立相应的模板,并填充数据
4. 配置相应的url
在user应用下建立urls.py文件,然后在主目录下的urls里这样配置
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^user/', include('df_user.urls',namespace='user')),
url(r'^', include('df_goods.urls',namespace='goods')),
url(r'^cart/',include('df_cart.urls')),
url(r'^order/',include('df_order.urls')),
url(r'^search/', include('haystack.urls')),
]
然后在对应的应用下的urls里配置`
from django.conf.urls import url
from . import views
urlpatterns =[
url(r'^register$',views.register),
url(r'^register_handle$',views.register_handle),
url(r'^login$',views.login),
url(r'^login_handle$',views.login_handle),
url(r'^user_center_info$',views.user_center_info),
url(r'^user_center_site$',views.user_center_site),
url(r'^user_center_order/(\d+)$',views.user_center_order),
url(r'^logout$',views.logout),
url(r'^register_exist$',views.register_exist),
]
到这里用户模块基本完成了