美文网首页
Python CGI 实战三:PyMySQL实现登录注册

Python CGI 实战三:PyMySQL实现登录注册

作者: CHASK | 来源:发表于2019-11-13 12:05 被阅读0次
    • 在实战二的基础上,加上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一下看看有无哪有问题叭!

    相关文章

      网友评论

          本文标题:Python CGI 实战三:PyMySQL实现登录注册

          本文链接:https://www.haomeiwen.com/subject/tkucictx.html