oracle 登录注册 项目,Django项目之用户登录与注册系统

4f84d0e0c8c9?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

beautiful school

1、项目介绍

用户登录和注册系统是所有网页设计都需要的一个模块,导航栏+登录+注册,在这个的基础上再来实现其他各个功能模块,所以,掌握这一个章节对Django的网页设计至关重要。

同时对MTV的设计过程更加的了解,数据库的设计,url路由设计,Views视图的设计,Templates模板的设计,forms.py前端模板的设计。也了解了表单、图片验证、Session会话、密码加密这些功能。对Django 的学习很有帮助。

2、搭建项目环境

(1) 创建虚拟环境

开始一个新的项目,搭建新的独立的隔离的虚拟环境

>> mkdir for_video # 新建文件夹

>> cd for_video # 进入该文件,准备安装虚拟环境

>> virtualenv --no-site-packages mysite_env # 创建项目的虚拟环境

#和系统安装的python有联系,系统中python.exe 删除,这个也不能使用了

# --no-site-packages,指定只需要一个干净的环境,不要原来带的各种第三方库

>> cd mysite_env/Script # 只能在这里打开虚拟环境

>> acitvate.bat # 开启虚拟环境

>> deactivate.bat # 退出虚拟环境

(2)安装Django

在虚拟环境中:

(mysite_env)>> pip install django==1.11.8 # 这里使用的是django1.11版本,此版本可长期使用

(3)创建工程和APP

(mysite_env)>> django-admin startproject mysite

(mysite_env)>> cd mysite

(mysite_env)/mysite/>> django-admin manage.py startapp login

(4)设置时区和语言

Django默认使用美国时间和英语,要改成亚洲/上海时间和汉语:

settings.py:

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

改成:

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

(5) 开启服务器验证

# 进入/mysite/

> python manage.py runserver

> python manage.py runserver 0.0.0.0:8000 # 浏览时用本机IP:8000端口号,需要更改将`host['*']`

3、模型设计(数据库设计)

(1)数据库模型设计

用户登录和注册项目,需要一种用户表User保存用户信息:

用户名

密码

性别

创建时间

login/models.py:

from django.db import models

class User(models.Model):

gender = (

('male', "男"),

('female', "女"),

)

name = models.CharField(max_length=128, unique=True)

password = models.CharField(max_length=256)

email = models.EmailField(unique=True)

sex = models.CharField(max_length=32, choices=gender, default="男")

c_time = models.DateTimeField(auto_now_add=True)

def __str__(self):

return self.name

class Meta:

ordering = ["-c_time"]

verbose_name = "用户"

verbose_name_plural = "用户"

name: 必填,最长不超过128个字符,并且唯一,不同名

password: 必填,最长不超过256个字符

sex: 使用了一个choice,只能选择男/女,默认为男

str,人性化显示对象信息

元数据中定义是按照用户创建时间的反序排列

(2)设置数据库后端

定义好了模型,就要选择用来保存数据的数据库。Django支持Mysql,SQLite,Oracle,等。

这里可以不用修改,就用自带的sqlite3数据库

settings.py:

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.sqlite3',

'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

}

}

(3)注册app

settings.py:

INSTALLED_APPS = [

'login',

]

(4) 创建记录和数据表

(mysite_env) /mysite/>python mange.py makemigrations # 保存数据迁移,也就是创建了User模型

(mysite_env) /mysite/>python mange.py migrate # 在数据库内创建真实的数据表

4、admin 后台

在admin后台管理界面测试和开发

(1) 在admin中注册模型

login/admin.py:

from . import models

admin.site.register(models.User)

(2)创建超级管理员

可以进入后台操作

> python manage.py createsuperuser

(3)启动开发服务器

5、url路由和视图

url路由-->视图-->前端模板

(1) 路由设置

URL

视图

模板

说明

/index/

login.views.index()

index.html

主页

/login//

login.views.login()

login.html

登录界面

/register/

login.views.register()

register.html

注册界面

/logout/

login.views.logout()

不需要

退出界面

mysite/urls.py:

from django.conf.urls import url

from django.contrib import admin

from login import views

urlpatterns = [

url(r'^admin/', admin.site.urls),

url(r'^index/', views.index),

url(r'^login/', views.login),

url(r'^register/', views.register),

url(r'^logout/', views.logout),

]

(2) 架构初步视图

login/views.py:

from django.shortcuts import render

from django.shortcuts import redirect

def index(request):

pass

return render(request, 'login/index.html')

def login(request):

pass

return render(request, 'login/login.html')

def register(request):

pass

return render(request, 'login/register.html')

def logout(request):

pass

return redirect("/index/")

(3) 创建HTML页面文件

login/templates/login下创建三个文件index.html

login.html以及register.html,模板如下:

首页

首页!

(4) 测试路由视图

6、前端页面设计

(1) 引入Bootstrap

到Bootstrap官网中,下载“用于生产环境”的包,bootstrap-3.3.7-dist,包含css、js和font(字体文件)。

到jquery官网中,下载jquery.js文件

在Django的根目录下新建一个static目录,整体拷贝

(2) 静态文件设置

用于指定静态文件的搜索目录:

settings.py :

STATICFILES_DIRS = [

os.path.join(BASE_DIR, "static"),

]

(3) 创建base.html 模板

需要引入bootstap模板导航条+引入Bootstrap+jquery静态文件

{% load staticfiles %}

{% block title %}base{% endblock %}

{% block css %}{% endblock %}

{% block content %}{% endblock %}

(4) 设计登录界面login.html

login/templates/login/login.html:

{% extends 'base.html' %}

{% load staticfiles %}

{% block title %}登录{% endblock %}

{% block css %}{% endblock %}

{% block content %}

欢迎登录

用户名:

密码:

重置

提交

{% endblock %}

在static/css目录中新建一个login.css样式文件:

body {

background-color: #eee;

}

.form-login {

max-width: 330px;

padding: 15px;

margin: 0 auto;

}

.form-login .form-control {

position: relative;

height: auto;

-webkit-box-sizing: border-box;

-moz-box-sizing: border-box;

box-sizing: border-box;

padding: 10px;

font-size: 16px;

}

.form-login .form-control:focus {

z-index: 2;

}

.form-login input[type="text"] {

margin-bottom: -1px;

border-bottom-right-radius: 0;

border-bottom-left-radius: 0;

}

.form-login input[type="password"] {

margin-bottom: 10px;

border-top-left-radius: 0;

border-top-right-radius: 0;

}

7、登录视图

(1) 登录视图

用户通过login.html中的表单来填写用户名和密码,并且以POST的方式发送到服务器的/login/地址。服务器通过/login/views.py中的login()视图函数,接收并且处理这一请求。

/login/views.py:

def login(request):

if request.method == "POST":

username = request.POST.get('username')

password = request.POST.get('password')

print(username, password)

return redirect('/index/')

return render(request, 'login/login.html')

CSRF验证:

login.html:

{% csrf_token %}

欢迎登录

......

(2) 数据验证

前端填写的信息可能不规范,后台需要验证和初步处理:

/login/views.py:

def login(request):

if request.method == "POST":

username = request.POST.get('username', None)

password = request.POST.get('password', None)

#确保当数据请求中没有username键时不会抛出异常,而是返回一个我们指定的默认值None;

if username and password: # 确保用户名和密码都不为空

username = username.strip()

# 用户名字符合法性验证

# 密码长度验证

# 更多的其它验证.....

return redirect('/index/')

return render(request, 'login/login.html')

(3) 验证用户名和密码:

和数据库中已注册的用户名和密码进行对比:

def login(request):

if request.method == "POST":

username = request.POST.get('username', None)

password = request.POST.get('password', None)

if username and password: # 确保用户名和密码都不为空

username = username.strip()

# 用户名字符合法性验证

# 密码长度验证

# 更多的其它验证.....

try:

user = models.User.objects.get(name=username)

except:

return render(request, 'login/login.html')

if user.password == password:

return redirect('/index/')

return render(request, 'login/login.html')

对于不合法的内容,前端页面提示:

login.html:

{% if message %}

{{ message }}

{% endif %}

{% csrf_token %}

欢迎登录

用户名:

密码:

重置

提交

8、Django表单

Django在内部集成了一个表单功能,以面向对象的方式,直接使用Python代码生成HTML表单代码,专门帮助我们快速处理表单相关的内容。

编写Django的form表单,非常类似我们在模型系统里编写一个模型。Django在内部集成了一个表单功能,以面向对象的方式,直接使用Python代码生成HTML表单代码,专门帮助我们快速处理表单相关的内容。

(1) 创建表单模型

新建 /login/forms.py:

from django import forms

class UserForm(forms.Form):

username = forms.CharField(label="用户名", max_length=128)

password = forms.CharField(label="密码", max_length=256, widget=forms.PasswordInput)

widget=forms.PasswordInput用于指定该字段在form表单里表现为,也就是密码输入框。

(2) 修改视图

login/views.py:

def login(request):

if request.method == "POST":

login_form = forms.UserForm(request.POST)

message = "请检查填写的内容!"

if login_form.is_valid():

username = login_form.cleaned_data['username']

password = login_form.cleaned_data['password']

try:

user = models.User.objects.get(name=username)

if user.password == password:

return redirect('/index/')

else:

message = "密码不正确!"

except:

message = "用户不存在!"

return render(request, 'login/login.html', locals())

login_form = forms.UserForm()

return render(request, 'login/login.html', locals())

(3) 修改login页面

login.html:

{% extends 'base.html' %}

{% load staticfiles %}

{% block title %}登录{% endblock %}

{% block css %}{% endblock %}

{% block content %}

{% if message %}

{{ message }}

{% endif %}

{% csrf_token %}

欢迎登录

{{ login_form }}

重置

提交

{% endblock %}

看的出来,只需要添加{{ login_form }}语句即可

{{ login_form.as_table }} 将表单渲染成一个表格元素,每个输入框作为一个

标签

{{ login_form.as_p }} 将表单的每个输入框包裹在一个

标签内

{{ login_form.as_ul }} 将表单渲染成一个列表元素,每个输入框作为一个

标签

这些渲染方法中都要自己手动编写

  • 标签

(4) 手动渲染表单字段

添加CSS和JS

input元素里少了一个CSS的类form-control

login/forms.py:

from django import forms

class UserForm(forms.Form):

username = forms.CharField(label="用户名", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control'}))

password = forms.CharField(label="密码", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control'}))

login.html:

{{ login_form.username.label_tag }}

{{ login_form.username}}

{{ login_form.password.label_tag }}

{{ login_form.password }}

(5) ModelForm

整合model模型和forms表单:

login/forms.py:

from django import forms

from . import models

class UserForm(forms.ModelForm):

class Meta:

model = models.User

fields = ['name', 'password']

def __init__(self, *args, **kwargs):

super(UserForm, self).__init__(*args, *kwargs)

self.fields['name'].label = '用户名'

self.fields['password'].label = '密码'

9、图片验证

使用第三方库:

(1) 安装captcha

(mysite_env)>pip install django-simple-captcha

(2) 注册captcha

settings.py:

INSTALLED_APPS = [

'captcha',

]

(3) 生成数据表

(mysite_env)/mysite/>python manage.py migrate

(4) 添加url路由

mysite/urls.py:

from django.conf.urls import include

urlpatterns = [

url(r'^captcha', include('captcha.urls')) # 增加这一行

]

(5) 修改forms.py

from captcha.fields import CaptchaField

class UserForm(forms.Form):

captcha = CaptchaField(label='验证码') #添加这一行

(6) 修改login.html

login.html中添加:

{{ login_form.captcha.errors }}

{{ login_form.captcha.label_tag }}

{{ login_form.captcha }}

大功告成

10、seession 会话

识别用户并保持用户状态

浏览器中的Cookie存放不重要的数据信息

服务器中的Session存放用户数据和状态

Session依赖Cookie

Django中默认启用session框架。当session启用后,传递给视图request参数的HttpRequest对象将包含一个session属性,就像一个字典对象一样。你可以在Django的任何地方读写request.session属性,或者多次编辑使用它。

(1) 使用session

login/views.py:

if user.password == password:

request.session['is_login'] = True

request.session['user_id'] = user.id

request.session['user_name'] = user.name

return redirect('/index/')

通过下面的if语句,我们不允许重复登录:

if request.session.get('is_login',None):

return redirect("/index/")

通过下面的语句,我们往session字典内写入用户状态和数据:

request.session['is_login'] = True

request.session['user_id'] = user.id

request.session['user_name'] = user.name

登出界面:

login/views.py:

def logout(request):

if not request.session.get('is_login', None):

# 如果本来就未登录,也就没有登出一说

return redirect("/index/")

request.session.flush()

# flush会一次性清空session中所有内容,可以使用下面的方法

# del request.session['is_login']

# del request.session['user_id']

# del request.session['user_name']

return redirect("/index/")

(2) 完善界面

base.html:

{% if request.session.is_login %}

当前在线:{{ request.session.user_name }} 登出

{% else %}

登录 注册

{% endif %}

11、注册视图

(1) 创建forms:

/login/forms.py:

class RegisterForm(forms.Form):

gender = (

('male', "男"),

('female', "女"),

)

username = forms.CharField(label="用户名", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control'}))

password1 = forms.CharField(label="密码", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control'}))

password2 = forms.CharField(label="确认密码", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control'}))

sex = forms.ChoiceField(label='性别', choices=gender)

captcha = CaptchaField(label='验证码')

(2) 完善register.html

和登录视图类似

{{ register_form.sex.label_tag }}

{{ register_form.sex }}

{{ register_form.captcha.errors }}

{{ register_form.captcha.label_tag }}

{{ register_form.captcha }}

(3) 实现注册视图

/login/views.py:

def register(request):

if request.session.get('is_login', None):

# 登录状态不允许注册。你可以修改这条原则!

return redirect("/index/")

if request.method == "POST":

register_form = forms.RegisterForm(request.POST)

message = "请检查填写的内容!"

if register_form.is_valid(): # 获取数据

username = register_form.cleaned_data['username']

password1 = register_form.cleaned_data['password1']

password2 = register_form.cleaned_data['password2']

email = register_form.cleaned_data['email']

sex = register_form.cleaned_data['sex']

if password1 != password2: # 判断两次密码是否相同

message = "两次输入的密码不同!"

return render(request, 'login/register.html', locals())

else:

same_name_user = models.User.objects.filter(name=username)

if same_name_user: # 用户名唯一

message = '用户已经存在,请重新选择用户名!'

return render(request, 'login/register.html', locals())

same_email_user = models.User.objects.filter(email=email)

if same_email_user: # 邮箱地址唯一

message = '该邮箱地址已被注册,请使用别的邮箱!'

return render(request, 'login/register.html', locals())

# 当一切都OK的情况下,创建新用户

new_user = models.User()

new_user.name = username

new_user.password = password1

new_user.sex = sex

new_user.save()

return redirect('/login/') # 自动跳转到登录页面

register_form = forms.RegisterForm()

return render(request, 'login/register.html', locals())

(4) 密码加密

使用Python内置的hashlib库,使用哈希值的方式加密密码。

login/views.py:

import hashlib

def hash_code(s, salt='mysite'):# 加点盐

h = hashlib.sha256()

s += salt

h.update(s.encode()) # update方法只接收bytes类型

return h.hexdigest()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值