cat views.py
from django.shortcuts import render,redirect from django.http import HttpResponse from . import models def index(request): if not request.session.get('is_login',None): return redirect('/login/') # return HttpResponse('Hello, world. You\'re at the polls index.') return render(request,'index.html') def login(request): if request.session.get('is_login',None): return redirect('/') if request.method == "POST": user = request.POST.get('username') password = request.POST.get('password') message='请检查填写内容!' print('------user:%s,password:%s------'%(user,password)) if user.strip() and password: try: u=models.User.objects.get(user=user) #a=models.table_name.objects.get(xx=xx,yy=yy) #返回一个数据对象.获取数据对象的某一个属性字段值通过点的方式获取如: print('---数据库用户:%s,密码:%s,注册日期:%s'%(u.user,u.passwd,u.c_time)) except Exception as f: print(f) message = '用户不存在!' return render(request,'login/login.html',{'message':message}) if u.passwd == password: request.session['is_login'] = True request.session['user_id'] = u.id request.session['user_name'] = u.user request.session['user_email'] = u.email return redirect('/') else: message = '密码不正确' return render(request,'login/login.html',{'message':message}) return render(request,'login/login.html',{'message':message}) return render(request,'login/login.html') #通过下面的if语句,我们不允许重复登录: # if request.session.get('is_login',None): # return redirect("/") # request.session['is_login'] = True # request.session['user_id'] = user.id # request.session['user_name'] = user.name def register(request): if request.session.get('is_login',None): return redirect('/') if request.method == 'POST': user = request.POST.get('username') password1 = request.POST.get('passwd1') password2 = request.POST.get('passwd2') email = request.POST.get('email') sex = request.POST.get('sex') print('user:%s,password1:%s,password2:%s,email:%s,sex:%s'%(user,password1,password2,email,sex)) if password1 != password2: message='两次密码不相同' return render(request,'login/register.html') else: sameuser = models.User.objects.filter(user=user) if sameuser: message='该用户已经存在' return render(request,'login/register.html') sameemail =models.User.objects.filter(email=email) if sameemail: message='该邮箱已经被注册了' return render(request,'login/register.html') #django的操作数据库get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错。 #django的操作数据库filter方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。 models.User.objects.create(user=user,passwd=password1,email=email,sex=sex) return redirect('/login/') return render(request,'login/register.html') def logout(request): if not request.session.get('is_login',None): return redirect('/login/') request.session.flush() return redirect("/login/")
cat index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h1>{{ request.session.user_name }}!欢迎回来</h1> <a>登录状态:{{ request.session.is_login }}</a><br> <a>用户名称:{{ request.session.user_name }}</a><br> <a>用户邮箱:{{ request.session.user_email }}</a><br> <p> <a href="/logout/">登出</a> </p> </body> </html>
cat register.html
<!DOCTYPE html> <html> <head> <title>欢迎注册</title> </head> <body> <form action="/register/" method="POST"> {% csrf_token %} <!--对表单进行csrf验证加持,防止跨站请求伪造--> <label>账号:<input type="text" name="username" value=""></label> <br> <label>密码:<input type="password" name="passwd1" value=""></label> <br> <label>重新输入密码:<input type="password" name="passwd2" value=""></label> <br> <label>邮箱:<input type="text" name="email" value=""></label> <br> <label>性别</label> <select name="sex"> <option value='male'>男</option> <option value='female'>女</option> </select> <input type="submit" value="注册"> <a href="/login/" ><ins>直接登录</ins></a> </form> </body> </html>
cat login.py
<!DOCTYPE html> <html> <head> <title>登陆</title> </head> <body> <div style = "margin:15%40%;" > <h2>欢迎登录!</h2 > <form action = "/login/" method ="post"> {% if message %} <div class="alert alert-warning">{{ message }}</div> {% endif %} {% csrf_token %} <label for="id_username">用户名:</label><input type="text" id ="id_username" name="username" required/> <br> <label for= "id_password">密码:</label><input type="password" id="id_password" placeholder="密码" name="password" required> <br> <input type ="submit" value ="登录"> <a href="/register/" class="text-success " ><ins>新用户注册</ins></a> </form > </div> </body> </html>
cat models.py
from django.db import models class User(models.Model): gender = (('male','男'),('female','女')) user = models.CharField(verbose_name=u'姓名',max_length=128,unique=True) passwd = models.CharField(verbose_name=u'密码',max_length=128) email = models.EmailField(verbose_name=u'邮箱',unique=True) sex = models.CharField(verbose_name=u'性别',max_length=32,choices=gender,default="男") c_time = models.DateTimeField(verbose_name=u'创建时间',auto_now_add=True) mod_date = models.DateTimeField(verbose_name=u'修改日期', auto_now=True) def __str__(self): return self.user class Meta: ordering = ['-c_time'] db_table = 'User' verbose_name = '用户表[User]' verbose_name_plural = '用户表[User]' #verbose_name=u'姓名',用于在admin界面添加正好时友好显示。不写添加账号会显示:字段名称 #unique唯一性 #auto_now无论是你添加还是修改对象,时间为你添加或者修改的时间。 #auto_now_add为添加时的时间,更新对象时不会有变动。 #choice只能选择'男'或者'女'.默认为男 #__str__是python的一个魔幻方法。作用于django管理界面用于将数据库中的记录展示为易读的字符串。 #Meta类用于定义表名称。默认表名称为'app名称_表名称',db_table用于指定表名 #ordering 用于指定一个字段,按照升序或降序对数据进行排序。指定的字段名称前加'-'表示递减,若没有加表示升序,若加'?'表示随机. #verbose_name用于在admin界面单数显示,verbose_name_plural复数形式显示。中文单数复数一般不做区别。 #verbose类似于User表在admin界面的显示形式。类似于别名
cat app下urls.py
from django.urls import path from . import views urlpatterns = [ path('', views.index,name='index'), ]
cat 项目urls.py
from django.contrib import admin from django.urls import path,include from Registration import views urlpatterns = [ path('',include('Registration.urls')), path('admin/', admin.site.urls), path('Registration/',include('Registration.urls')), path('login/',views.login), path('register/',views.register), path('logout/',views.logout), ]