python实现可注册登录查询修改的网站
使用Flask+html
pip 引入Flask库,使用数据库管理用户信息,密码哈希加密后存储,可向邮箱发送验证码。
这里不单独出示所有html代码,仅贴index以作参考。
main.py
#!/usr/bin/python3.8
# -*- coding: UTF-8 -*-
#powered by 辞清明S-joker
#搭建时间:2019/11/20 —— 2019/12/2
#该网站利用python-flask搭建
#以下导入模块,实现数据库操作,网站搭建,页面渲染,前端获取数据,哈希加密,邮件发送,随机码,追踪错误
import sqlite3
from flask import Flask
from flask import render_template
from flask import request
from werkzeug.security import generate_password_hash,check_password_hash
from flask_mail import Mail,Message
import random
import traceback
#网站搭建
app = Flask(__name__)
#邮箱搭建
app.config['MAIL_SERVER'] = 'smtp.qq.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USERNAME'] = "********@qq.com"#这里填发送端邮箱号
app.config['MAIL_PASSWORD'] = "*********"#这里是邮箱授权码,不知道怎么搞的同学可以自己去查,论坛都有详细指导
app.config['MAIL_USE_TLS'] = False
app.config['MAIL_USE_SSL'] = True
mail = Mail(app)
#以下实现页面渲染,不同页面跳转(与html搭配使用)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login')
def login():
return render_template('login.html')
@app.route('/email')
def regist():
return render_template('email.html')
@app.route('/update')
def update():
return render_template('update.html')
@app.route('/updatepwd')
def updatepwd():
return render_template('updatepwd.html')
@app.route('/updatenick')
def updatenick():
return render_template('updatenick.html')
@app.route('/delete')
def delete():
return render_template('delete.html')
def Response_headers(content):
resp = Response(content)
resp.headers['Access-Control-Allow-Origin'] = '*'
return resp
#邮箱即为账号,向邮箱发送验证码,验证成功才能注册
@app.route('/emailuser')
def getEmailRequest():
#接收邮箱,作为账号,这里仅支持qq邮箱
user_id = request.args.get('user')
#生成4位验证码
str1 = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
code=''
for i in range(4):
num = random.randint(0,len(str1)-1)
code += str1[num]
#向邮箱发送验证码
message = Message(subject='gsp的友情验证码',sender="2857490843@qq.com",recipients=['%s@qq.com'% user_id],body='你的验证码:%s'%code)
#缓存验证码,这里使用的是数据库里另一表单
try:
mail.send(message)
db = sqlite3.connect("test.db")
cursor = db.cursor()
sql = "INSERT INTO email(account,code) VALUES ('%s', '%s')" % (
user_id,code)
try:
cursor.execute(sql)
db.commit()
#验证码发送完毕,跳转到注册页面
return render_template('regist.html')
except:
traceback.print_exc()
db.rollback()
return '验证码缓存失败'
db.close()
except Exception as e:
print(e)
return '发送失败'
#注册功能
@app.route('/registuser')
def getRigistRequest():
#接收用户注册信息和验证码
user_id = request.args.get('user')
user_pwd = request.args.get('password')
user_nick = request.args.get('nickname')
mail_code = request.args.get('code')
#对密码进行哈希加密
user_pwd_hash = generate_password_hash(user_pwd)
#验证验证码
db = sqlite3.connect("test.db")
cursor = db.cursor()
sql1 = "select * from email where account='%s' and code='%s'" %(user_id,mail_code)
sql2 = "INSERT INTO user(account, password, nickname) VALUES ('%s', '%s', '%s')" % (
user_id, user_pwd_hash, user_nick)
try:
cursor.execute(sql1)
results1 = cursor.fetchall()
if len(results1) == 1:
#验证成功后,讲用户信息存入数据库
try:
cursor.execute(sql2)
#删除已经使用过的验证码
cursor.execute("delete from email where account='%s' " %(user_id))
db.commit()
#注册完毕,自动跳转至登录界面
return render_template('login.html')
except:
traceback.print_exc()
db.rollback()
return '注册失败'
else:
return '验证码不正确'
except:
traceback.print_exc()
db.rollback()
return '验证失败'
db.close()
#登录功能
@app.route('/loginuser')
def getLoginRequest():
db = sqlite3.connect("test.db")
cursor = db.cursor()
user_id = request.args.get('user')
user_pwd = request.args.get('password')
#对数据库里的账户(邮箱)检索
sql = "select * from user where account='%s'" %(user_id)
try:
cursor.execute(sql)
results = cursor.fetchall()
if len(results) == 1:
#检索到邮箱后,对存储的密文和用户输入的密码对比
for row in results:
i =check_password_hash(row[2],user_pwd)
if i:
user_nick= row[3]
#若邮箱和密码正确,登陆成功,自动跳转到用户信息页面
return render_template('information.html',user_id=user_id,user_nick=user_nick)
else:
return '密码不正确'
else:
return '邮箱不存在'
db.commit()
except:
traceback.print_exc()
db.rollback()
return '登陆失败'
db.close()
#网站设计为:只有登录后才能修改信息
#修改密码
@app.route('/updatepwduser')
def getUpdatePwdRequest():
db = sqlite3.connect("test.db")
cursor = db.cursor()
user_id = request.args.get('user')
#输入新密码
user_pwd_new = request.args.get('password')
user_pwd_hash = generate_password_hash(user_pwd_new)
#对数据库进行修改
sql = "update user set password='%s' where account='%s' " %(user_pwd_hash,user_id)
try:
cursor.execute(sql)
db.commit()
return '密码修改成功'
except:
traceback.print_exc()
db.rollback()
return '修改失败'
db.close()
#修改昵称
@app.route('/updatenickuser')
def getUpdateNickRequest():
db = sqlite3.connect("test.db")
cursor = db.cursor()
user_id = request.args.get('user')
user_nick_new = request.args.get('nickname')
print(user_nick_new)
sql = "update user set nickname='%s' where account='%s' " %(user_nick_new,user_id)
try:
cursor.execute(sql)
db.commit()
#昵称修改成功后,自动跳转到用户信息页面以供用户查看
return render_template('information.html',user_id=user_id,user_nick=user_nick_new)
except:
traceback.print_exc()
db.rollback()
return '修改失败'
db.close()
#注销账户
@app.route('/deleteuser')
def getDeleteRequest():
db = sqlite3.connect("test.db")
cursor = db.cursor()
#注销之前要确认邮箱和密码
user_id = request.args.get('user')
user_pwd = request.args.get('password')
sql1 = "select * from user where account='%s'" %(user_id)
try:
cursor.execute(sql1)
results = cursor.fetchall()
if len(results) == 1:
for row in results:
i =check_password_hash(row[2],user_pwd)
#只有密码正确之后可以注销账户
if i:
sql2 = "delete from user where account='%s' " %(user_id)
try:
cursor.execute(sql2)
db.commit()
return '注销成功'
except:
traceback.print_exc()
db.rollback()
return '注销失败'
else:
return '密码不正确'
else:
return '邮箱不存在'
db.commit()
except:
traceback.print_exc()
db.rollback()
return '操作失败'
db.close()
if __name__ == '__main__':
app.run(port=3000, debug = True)
db.py
import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
cursor.execute('create table email(id int(10) primary key, account varchar(50),code varchar(4))')
cursor.close()
conn.close()
index.html
<!DOCTYPE html>
<html>
<center>
<head>
<meta charset="UTF-8">
<title>计算机部撩妹经验分享网站</title>
</head>
<body>
<h1>欢迎来到撩妹分享会!</h1>
<p>Welcome to 4-304!</p>
<p>Powered by 辞清明S-joker</p>
<p></p>
<p></p>
<form method="get" action='/login'>
<input type="submit" value="登录">
</form>
<p></p>
<form method="get" action='/email'>
<input type="submit" value="注册">
</form>
</body>
</center>
</html>