django2.2练习实现用户模拟登录

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),
]

1416f7c31b6fa876b8437d7dd16f99582cd.jpg

621ae1b4d1fa5549539e63b87885d7a0ba0.jpg

8a964ce8bc8248cdfb3621cb42b9cd9855c.jpg

d94a80f75f307ea4d1f94165d2833199b21.jpg

转载于:https://my.oschina.net/wangyunlong/blog/3075949

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值