Python CGI 实战三:PyMySQL实现登录注册
2019-11-13 本文已影响0人
CHASK
- 在实战二的基础上,加上PyMySQL数据库对用户登录注册的操作
最终效果
- 建立数据库pydemo,前端还是用实战二那两个界面(login.html和register.html),编写login_sql.py和register_sql.py两个CGI脚本文件进行数据库的操作
第一步:建数据库!
-
PyMySQL的安装配置网上有挺多帖子的,如果建表也有很多介绍,这里就不赘述了
-
因为太懒得打代码来建表了,推荐可以使用这些傻瓜式建表的数据库可视化工具:我使用的是Navicat Premium,安装配置也可自行搜索~
-
建立了一个pydemo库,设计了users表,表中包含的内容如下:
image.png -
ok!完成建表后就可以进入编写代码!
第二步:小小修改login.html & register.html
-
其实就是修改下点击提交后,触发的cgi文件路径,将名字改成我们一会要编写的这两个cgi
image.png
image.png
第三步:编写判断用户登录的脚本文件 login_sql.py
- 这里我遇到了个很大的关于import pymysql的坑,在pycharm里运行不报错,一到打开cgi就报错,查看apache的日志,报“没有pymysql这个包”的错误,看到一个帖子也遇到了这样的问题,指出是pycharm运行的py版本是它自己的,而cgi似乎是运行系统默认那个py版本
- 于是在终端install pymysql折腾了好久,给电脑里每个版本的python都安装了pymysql,但还是报错QAQ,最后互联网海洋捞针,发现了import sys的方法引入pymysql!
- 希望大家都比我好运蛤,不会遇到那么多奇妙bug
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# CGI处理模块
import cgi
# 我的电脑由于种种不可知原因,即便给电脑中存在每个版本的python都import了pymysql,运行起来cgi还是会报错无pymysql,最后只好使用引用绝对路径的方式引入pymysql
# 见仁见智,如果直接import pymysql成功则不需引入sys这两句
import sys
sys.path.append("/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages")
import pymysql
# 创建 FieldStorage 的实例化
form = cgi.FieldStorage()
#获取前端用户输入的数据
uname = form.getvalue("uname")
upass = form.getvalue("upass")
#连接数据库
#这里的user,password,db都是各有不同的蛤,需要修改你自己的库信息
con = pymysql.connect(host='localhost', user='root', password='cyj123', db='pydemo', charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with con.cursor() as cursor:
#查找
sql = "select password from users where email = %s"
cursor.execute(sql, str(uname))
con.commit()
result = cursor.fetchone()
print("Content-type:text/html")
print('')
print('<html>')
print('<head>')
print('<meta charset="utf-8">')
if result == None or upass != result["password"]:
print('<meta http-equiv="Refresh" content="3;url=/login.html">')
print('<title>登录</title>')
print('</head>')
print('<body>')
print('<h>用户名或密码错误!正在跳转至重新登录界面...</h>')
else:
print('<title>登录</title>')
print('</head>')
print('<body>')
print('<h>登录成功!<h>')
print('</body>')
print('</html>')
finally:
con.close()
第四步:编写判断用户注册的脚本文件 register_sql.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# CGI处理模块
import cgi
# 我的电脑由于种种不可知原因,即便给电脑中存在每个版本的python都import了pymysql,运行起来cgi还是会报错无pymysql,最后只好使用引用绝对路径的方式引入pymysql
# 见仁见智,如果直接import pymysql成功则不需引入sys这两句
import sys
sys.path.append("/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages")
import pymysql
# 创建 FieldStorage 的实例化
form = cgi.FieldStorage()
#获取前端用户输入的数据
rname = form.getvalue("rname")
rpass = form.getvalue("rpass")
#连接数据库
#这里的user,password,db都是各有不同的蛤,需要修改你自己的库信息
con = pymysql.connect(host='localhost', user='root', password='cyj123', db='pydemo', charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
#判断是否输入空信息
if rname == None or rpass == None:
print("Content-type:text/html")
print('')
print('<html>')
print('<head>')
print('<meta charset="utf-8">')
print('<meta http-equiv="Refresh" content="3;url=/register.html">')
print('<title>注册</title>')
print('</head>')
print('<body>')
print('<h>用户名或密码不得为空!正在跳转至重新注册页面...<h>')
print('</body>')
print('</html>')
else:
try:
with con.cursor() as cursor:
#先查询是否已有相同账户
sql = "select * from users where email = %s"
cursor.execute(sql, str(rname))
con.commit()
result = cursor.fetchone()
print("Content-type:text/html")
print('')
print('<html>')
print('<head>')
print('<meta charset="utf-8">')
#若无,再进行添加操作
if result == None:
sql = "insert into users (email,password) values (%s,%s)"
cursor.execute(sql, (str(rname), str(rpass)))
con.commit()
print('<meta http-equiv="Refresh" content="1;url=/login.html">')
print('<title>注册</title>')
print('</head>')
print('<body>')
print('<h>注册成功!正在跳转至登录页面...</h>')
else:
print('<meta http-equiv="Refresh" content="1;url=/register.html">')
print('<title>注册</title>')
print('</head>')
print('<body>')
print('<h>此账号已存在!正在跳转至重新注册页面...<h>')
print('</body>')
print('</html>')
finally:
con.close()
结束!
run一下看看有无哪有问题叭!