首先是用户的注册功能
1) 在user的视图函数中定义:
from django.shortcuts import render,HttpResponse
from user.models import User # 导入user,查看用户是否被注册
from course import views as course_views # 与视图联系
def register_handler(request):
if request.method != 'POST':
return HttpResponse(status=403)
context =request.context # 修改过后的,修改前是{}
account=request.POST.get('account')
password = request.POST.get('password')
try:
user_exists= User.objects.filter(account = account).exists()
if not user_exists:
user = User(account=account,password=password)
user.save()
request.session['session_user'] ={'id':user.id,'account':user.account}
else:
context['register_message']= '账号已存在'
except:
context['register_message']='服务器异常'
finally:
return course_views.index_handler(request)
2)在base文件中修改代买,使其能够了解到用户是否注册以及注册后的显示:
<!-- 注册 -->
<div id="register"
{% if not register_message %} <!-- 添加 -->
hidden="hidden">
{% endif %}
<h2 class="form_p">注册</h2>
<p id="register_message">
{{ register_message }} <!-- 添加 -->
<!--信息有误-->
</p>
<form action="{% url 'user_register' %}" method="post" id="register_form">
{% csrf_token %}
<input id="register_account" type="text" name="account" placeholder="账号(数字、英文、下换线,8-16位)"><br/>
<input id="register_password" type="password" name="password" placeholder="密码(数字、英文、下换线,6-16位)"><br/>
<!--<input type="password" name="repassword" placeholder="确认密码"><br/>-->
<input id="register_submit" type="submit" value="注册">
</form>
</div>
3)新建一个中间件文件
from django.utils.deprecation import MiddlewareMixin
class MyMiddleware(MiddlewareMixin):
def __init__(self,get_response=None):
super().__init__(get_response)
# 初始化中间件
print('init_mymiddleware')
def process_request(self,request):
# 在request对象中添加一个context字典
request.context = {}
# 如果session中有session_user
if 'session_user' in request.session.keys():
# 把session中的session_user添加到request.context中
request.context['session_user'] = request.session['session_user']
def process_response(self,request,response):
# 必须return response
print('process_response')
return response
在settings中加入中间件:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'middleware.MyMiddleware' # 添加的中间件
]
【此时的course的视图函数代码】
from django.shortcuts import render
from .models import Course,Category
# Create your views here.
def index_handler(request):
context = request.context
category_s = Category.objects.all()
course_data_s = []
for category in category_s:
course_data_s.append(
{
'category':category.name,
'course_s':category.courses_set.all()
}
)
context['course_data_s'] = course_data_s
return render(request,'index.html',context)
def course_handler(request,course_id):
return None
def video_handler(request,course_id):
return None
def videoStream_handler(request,course_id):
return None
- 完成后启动服务,注册账号,刷新数据库user,会出现注册好的用户信息!若是已经注册过的,它直接显示账号已存在!
5)使页面只显示用户知否登录和登录后的状态,我们需要在base的文件中的登录处修改代码,用if语句判断:
</span>
<span class="user">
{% if not session_user %}
<a href="javascript:show('login')">登录</a>/
<a href="javascript:show('register')">注册</a>
{% else %}
<!-- 已经登录显示的内容 -->
你好:
<a href="{% url 'user_index' %}">{{ session_user.account }}</a>
<a href="{% url 'user_logout' %}">注销</a>
{% endif %}
</span>
与之对应的中间件部分是:
def process_request(self,request):
# 在request对象中添加一个context字典
request.context = {}
# 如果session中有session_user
if 'session_user' in request.session.keys():
# 把session中的session_user添加到request.context中
request.context['session_user'] = request.session['session_user']
退出功能
1)在用户的views视图函数中先导包,然后配置退出功能:
from django.shortcuts import render,HttpResponse,redirect,reverse
from user.models import User # 导入user,查看用户是否被注册
from course import views as course_views
def logout_handler(request):
request.session['session_user'] =None
return redirect(reverse('course_index'))
然后首页只会显示登录和注册了!
登录功能
1)首先在视图函数中定义这个功能:
def login_handler(request):
if request.method != 'POST': # 判断是否为post请求
return HttpResponse(status=403)
context= request.context
account = request.POST.get('account')
password = request.POST.get('password')
user_s = User.objects.filter(account=account,password=password)
if user_s:
user = user_s[0]
request.session['session_user'] = {'id': user.id, 'account': user.account}
return redirect(reverse('course_index')) # 第一种方法
# context['session_user']= {'id': user.id, 'account': user.account} # 第二种方法!
else:
context['login_message'] = '账号或密码错误'
return course_views.index_handler(request)
2)找到base文件,修饰登录部分的代码:
<!-- 登录 -->
<div id="login"
{% if not login_message %} <!-- 添加的判断语句 -->
hidden="hidden">
{% endif %}
<h2 class="form_p">登录</h2>
<p id="login_message">
{{ login_message }}
<!--信息有误-->
</p>
<form action="{% url 'user_login' %}" method="post" id="login_form">
{% csrf_token %} <!-- 添加地址与token -->
<input id="login_account" type="text" name="account" placeholder="账号"><br>
<input id="login_password" type="password" name="password" placeholder="密码"><br>
<input id="login_submit" type="submit" value="登录">
</form>
</div>
完成操作后,用户可以正常的登录注册与退出了!
个人页面的显示
1)首先是用户的视图函数的修饰:
from django.shortcuts import render,HttpResponse,redirect,reverse
from user.models import User
from course import views as course_views
# Create your views here.
def index_hander(request):
# 得到request中的context对象
context = request.context
# 得到session中保存登录的信息
# 如果session中没有session_user这个键,会报错,所以如果没有用户登录,不允许访问user中的index_handler,后续在中间件中会加入访问权限
session_user = request.session['session_user']
# 得到当前用户的user对象
user = User.objects.get(id=session_user.get('id'))
# 把user对象封装到context中
context['user'] = user
# 如果是GET请求,要展示用户的详细信息
if request.method == 'GET':
# 渲染模板
return render(request,'user.html',context)
# 如果不是GET请求,视为POST请求,为用户修改个人信息
else:
# 得到表单中提交的数据
# 【注意】
# 这里需要对用户提交的数据进行表单验证,必须确定信息符合规范,才可以写入数据库
# 推荐使用正则表达式进行验证,同学们可以自行尝试
# 对于不符合规范的数据提交,可以返回403
user.username = request.POST.get('username')
user.gender = request.POST.get('gender')
user.tel = request.POST.get('tel')
# 数据保存
user.save()
# 重定向到用户主页
return redirect(reverse('user_index'))
2)修改user.html文件
{% extends 'base.html' %}
{% block title %}
{% endblock %}
{% block article %}
<section class="main_section">
<hr>
<section id="user_manage">
<nav>
<p><a href="{% **url 'user_index**' %}">个人资料</a></p>
<p><a href="*{% url 'user_course' %}*">我的课程</a></p>
<p><a href="*{% url 'user_shoppingCart' %}*">购物车</a></p>
</nav>
<section class="user_info">
<div class="user_info_wrapper">
<ul>
<li>
<label>账 号:</label><span>{{ *user.account* }}</span>
</li>
<li>
<label>余 额:</label><span>{{ *user.money* }}</span>
</li>
</ul>
*<form action="{% url 'user_index' %}" method="post">
{% csrf_token %}*
<ul>
<li>
<label>用户名:</label>
<input type="text" name="username" value="*{{ user.username }}">*
</li>
<li>
<label>性 别:</label>
*{% if not user.gender %}
<input type="radio" name="gender" value="0" checked="checked">男
<input type="radio" name="gender" value="1">女
{% else %}
<input type="radio" name="gender" value="0">男
<input type="radio" name="gender" value="1" checked="checked">女
{% endif %}*
</li>
<li>
<label>手机号:</label>
<input type="text" name="tel" value="*{{ user.tel }}*">
</li>
<li>
<input type="submit" value="修改">
<input type="reset" value="重置">
</li>
</ul>
</form>
</div>
</section>
</section>
</section>
{% endblock %}
修改完成后,就可以进入用户的页面!