Django+前端\django\myweb\blog\middleware\auth.py
from django. utils. deprecation import MiddlewareMixin
from django. shortcuts import HttpResponse, redirect
import re
class AuthMiddleware ( MiddlewareMixin) :
"""中间件AuthMiddleware"""
def process_request ( self, request) :
path_info_regex = re. compile ( r'^/img/check_code/' )
match = path_info_regex. match ( request. path_info)
if match :
return
if request. path_info in [ "/login/" ] :
return
info_dict = request. session. get( 'info' )
if info_dict:
return
return redirect( "/login/" )
class M1 ( MiddlewareMixin) :
"""中间件M1"""
def process_request ( self, request) :
print ( "M1 进来了" )
return HttpResponse( "无权访问" )
def process_response ( self, request, response) :
print ( "M1 出去了" )
return response
class M2 ( MiddlewareMixin) :
"""中间件M2"""
def process_request ( self, request) :
print ( "M2 进来了" )
def process_response ( self, request, response) :
print ( "M2 出去了" )
return response
Copy
Django+前端\django\myweb\myweb\settings.py
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware' ,
'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' ,
'blog.middleware.auth.AuthMiddleware' ,
'django.middleware.cache.FetchFromCacheMiddleware'
]
Copy
Django+前端\django\myweb\blog\utils\check_code.py
import random, string
from PIL import Image, ImageDraw, ImageFont, ImageFilter
def check_code ( width= 120 , height= 30 , char_length= 5 , font_file= 'D:\\git-python\\前端\\django\\myweb\\blog\\utils\\ttf\\kumo.ttf' , font_size= 28 ) :
code = [ ]
img = Image. new( mode= 'RGB' , size= ( width, height) , color= ( 255 , 255 , 255 ) )
draw = ImageDraw. Draw( img, mode= 'RGB' )
def rndChar ( ) :
"""
生成随机字母
:return:
"""
return random. choice( string. ascii_letters)
def rndColor ( ) :
"""
生成随机颜色
:return:
"""
return ( random. randint( 0 , 255 ) , random. randint( 10 , 255 ) , random. randint( 64 , 255 ) )
font = ImageFont. truetype( font_file, font_size)
for i in range ( char_length) :
char = rndChar( )
code. append( char)
h = random. randint( 0 , 4 )
draw. text( [ i * width / char_length, h] , char, font= font, fill= rndColor( ) )
for i in range ( 18 ) :
draw. point( [ random. randint( 0 , width) , random. randint( 0 , height) ] , fill= rndColor( ) )
for i in range ( 18 ) :
draw. point( [ random. randint( 0 , width) , random. randint( 0 , height) ] , fill= rndColor( ) )
x = random. randint( 0 , width)
y = random. randint( 0 , height)
draw. arc( ( x, y, x + 4 , y + 4 ) , 0 , 90 , fill= rndColor( ) )
for i in range ( 5 ) :
x1 = random. randint( 0 , width)
y1 = random. randint( 0 , height)
x2 = random. randint( 0 , width)
y2 = random. randint( 0 , height)
draw. line( ( x1, y1, x2, y2) , fill= rndColor( ) )
img = img. filter ( ImageFilter. EDGE_ENHANCE_MORE)
return img, '' . join( code)
if __name__ == '__main__' :
img, code = check_code( )
img. show( )
pass
Copy
Django+前端\django\myweb\blog\utils\password.py
import string
import re
def check_fips_password_complexity ( password) :
if len ( password) < 8 :
return "密码长度不合格,不低于8位"
uppercase_letters = string. ascii_uppercase
lowercase_letters = string. ascii_lowercase
digits = string. digits
special_chars = string. punctuation. replace( "?" , "" )
if not any ( char in uppercase_letters for char in password) :
return "密码必须包含至少一个大写字母"
if not any ( char in lowercase_letters for char in password) :
return "密码必须包含至少一个小写字母"
if not any ( char in digits for char in password) :
return "密码必须包含至少一个数字"
if not any ( char in special_chars for char in password) :
return "密码必须包含至少一个特殊字符"
if re. search( r'[\s\x00]' , password) :
return "密码包含不允许的字符(空格、中止字符等)"
return True
if __name__ == "__main__" :
password = "Example1="
str = check_fips_password_complexity( password)
print ( str )
Copy
Django+前端\django\myweb\blog\views\account.py
from django. shortcuts import render, redirect
from blog. models import Admin
from blog. utils. form import LoginForm
from django. http import HttpResponse, HttpResponseRedirect
from blog. utils. check_code import check_code
from io import BytesIO
def login ( request) :
if request. method == "GET" :
form = LoginForm( )
context = {
"form" : form,
}
return render( request, "login.html" , context)
form = LoginForm( data= request. POST)
if form. is_valid( ) :
user_input_code = form. cleaned_data. pop( 'code' )
image_code = request. session. get( 'image_code' , "" )
if user_input_code. upper( ) != image_code. upper( ) :
form. add_error( "code" , "验证码错误!" )
context = {
"form" : form,
}
return render( request, "login.html" , context)
user_object = Admin. objects. filter ( username= form. cleaned_data[ 'username' ] ) . first( )
admin_object = Admin. objects. filter ( username= form. cleaned_data[ 'username' ] , password= form. cleaned_data[ 'password' ] ) . first( )
if not user_object:
form. add_error( "username" , "用户名错误!" )
context = {
"form" : form,
}
return render( request, "login.html" , context)
elif not admin_object:
form. add_error( "password" , "密码错误!" )
context = {
"form" : form,
}
return render( request, "login.html" , context)
else :
""" COOKIES
# 例子1:不使用模板
response = HttpResponse("hello world")
response.set_cookie(key,value,max_age)
return response
# 例子2: 使用模板
response = render(request,'xxx.html', context)
response.set_cookie(key,value,max_age)
return response
# 例子3: 重定向
response = HttpResponseRedirect('/login/')
response.set_cookie(key,value,max_age)
return response
# 删除
response.delete_cookie('username')
# 获取 COOKIES值
# 方法一
request.COOKIES['username']
# 方法二
request.COOKIES.get('username','')
# 判断是否存在
request.COOKIES.has_key('cookie_name')
"""
""" session
# 设置session的值
request.session['key'] = value
request.session.set_expiry(time): 设置过期时间, 0表示浏览器关闭则失效
# 获取session的值
request.session.get('key', None)
# 判断一个key是否在session里
'fav_color' in request.session
# 获取所有session的key和value
request.session.keys()
request.session.values()
request.session.items()
# 清除所有session
request.session.clear() # 只删除session中值得部分
# 删除所有session
# request.session.flush() # 删除session中的整条记录
# 删除key为age的session
del request.session["age"]
"""
response = HttpResponseRedirect( '/admin_list/' )
response. set_cookie( 'id' , admin_object. id , 3600 )
response. set_cookie( 'name' , admin_object. username, 3600 )
request. session[ "info" ] = { 'id' : admin_object. id , 'name' : admin_object. username}
request. session. set_expiry( 60 * 60 * 24 * 7 )
del request. session[ "image_code" ]
return response
context = {
"form" : form,
}
return render( request, "login.html" , context)
def loginout ( request) :
""" 注销 """
request. session. clear( )
return redirect( "/login/" )
def check_code_img ( request, random) :
"""生成图片验证码"""
img, code_string = check_code( width= 120 , height= 30 , char_length= 5 , font_file= 'D:\\git-python\\Django+前端\\django\\myweb\\blog\\utils\\ttf\\kumo.ttf' , font_size= 28 )
request. session[ 'image_code' ] = code_string
request. session. set_expiry( 60 )
stream = BytesIO( )
img. save( stream, 'png' )
return HttpResponse( stream. getvalue( ) )
Copy
Django+前端\django\myweb\myweb\urls.py
urlpatterns = [
path( 'img/check_code/' , account. check_code_img) ,
re_path( r'img/check_code/(?P<random>\d+)' , account. check_code_img) ,
]
Copy
Django+前端\django\myweb\blog\templates\login.html
<! DOCTYPE html >
< html lang = " en" >
< head>
< meta charset = " UTF-8" />
< meta name = " viewport" content = " width=device-width, initial-scale=1.0" />
< title> 员工管理系统-登录</ title>
{% load static %}
< link rel = " stylesheet" href = " {% static ' plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}" />
< style>
.account {
width : 400px;
border : 1px solid #dddddd;
border-radius : 5px;
box-shadow : 5px 5px 20px #aaa;
margin-left : auto;
margin-right : auto;
margin-top : 100px;
padding : 20px 40px;
}
.account h2 {
margin-top : 10px;
text-align : center;
}
</ style>
</ head>
< body>
< div class = " account" >
< h2> 用户登录</ h2>
< div class = " panel-body" >
< form method = " post" novalidate >
{% csrf_token %}
< div class = " form-group" >
< label> 用户名</ label>
{{ form.username }}
< span style = " color : red; " > {{ form.errors.username.0 }}</ span>
</ div>
< div class = " form-group" >
< label> 密码</ label>
{{ form.password }}
< span style = " color : red; " > {{ form.errors.password.0 }}</ span>
</ div>
< div class = " form-group" >
< label for = " id_code" > 图片验证码</ label>
< div class = " row" >
< div class = " col-xs-7" >
{{ form.code }}
< span style = " color : red; " > {{ form.errors.code.0 }}</ span>
</ div>
< div class = " col-xs-5" >
< img id = " image_code" src = " /img/check_code/666" onclick = " change_img ( ) " title = " 点击换验证码" >
</ div>
</ div>
</ div>
< button type = " submit" class = " btn btn-primary center-block" style = " width : 80px; " > 登录</ button>
</ form>
</ div>
</ div>
< script src = " {% static ' js/jquery-3.7.1.min.js' %}" > </ script>
< script src = " {% static ' plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}" > </ script>
< script>
function change_img ( ) {
var img = document. getElementById ( "image_code" ) ;
img. src= '/img/check_code/' + ( new Date ( ) ) . getTime ( ) ;
}
</ script>
</ body>
</ html>
Copy