Flask实现登陆功能(python3.6)

环境配置

IDE个人建议使用 pycharm (我们学校邮箱可以注册 Professional 的学生用户 实在不行百度注册机emmmmmmm)

mysql数据库

安装 flask 库(python3.6自行安装):

$ pip3 install flask
$ pip3 install pymysql

新建项目

新建 pycharm 项目,选择 flask , create 即可创建一个默认项目。其中 app.py 中内容如下。

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

直接运行后,网址输入 127.0.0.1:5000 即可看到Hello World!
注:此后的 python 代码都是在 app.py 的基础上修改。

项目详解

我们先分析一下默认项目中为我们完成了什么事情。
导包、实例化。

from flask import Flask

app = Flask(__name__)

定义一个函数hello_world(),用了app.route(str)这个修饰器,如果访问 host+str 这个url ,Flask会路由到这个函数,并将return的值返回给请求(即HTML页面的源码)。如果我们查看该网页的源码,会发现只有Hello World!这个字符串。

@app.route('/')
def hello_world():
    return 'Hello World!'

登陆界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login In Admin</title>
</head>
<body>
    <form>
        <div id="username">
            用户名:
            <input name="id_username" type="text">
        </div>
        <div id="password">
            密 码:
            <input name="id_password" type="password">
        </div>
        <div>
            <input type="submit">
        </div>
    </form>
</body>
</html>

这是一个登陆页面的 html 源码,但是如果直接 return 这个字符串,我们就要用到多行字符串,不利于项目的维护。对此,flask 提供了模板功能。
打开项目,可以看到在主目录下有一个文件夹,名为 templates 。这个文件夹就是保存所有的模板文件的。将上方 html 源码保存为 login.html 到该文件夹下即创建了一个登陆界面的模板。
模板创建好了,那么我们如何使用呢?

from flask import render_template

@app.route('/')
def hello_world():
    return render_template('login.html')

flask 提供了解析模板的函数——render_template,默认在templates中搜索模板,此时我们再运行 app.py 即可看到,网页换成了我们想要的页面。

登陆功能

虽然我们完成了登陆界面,但是仍然没有实现登陆的功能,submit 按钮形同虚设,对此我们需要给 login.html 添加一些内容,告诉它要把 form 表单中的数据发送到哪里。为了方便测试,我们再新建几个函数。

# 导入 redirect 函数,该函数能够将页面重定向到另一个路由
from flask import redirect
# 导入 request 对象,request 保存了浏览器请求所携带的所有数据
# request.args中存储GET方法传输的数据
# request.form中存储POST方法传输的数据
from flask import request

# 逻辑判断
@app.route('/redirect')
def true_of_false():
    if request.args['id_username'] == '123' and request.args['id_password'] == '123':
        return redirect('/welcome')
    else:
        return redirect('/forbidden')


@app.route('/welcome')
def correct_info():
    return '信息正确!Welcome!'


@app.route('/forbidden')
def incorrect_info():
    return '信息错误!Forbidden!'

在 login.html 中的 标签内添加属性:

<form action="/redirect">

这样浏览器就知道将表单中填入的内容发送到哪里。

其中 true_or_false() 是逻辑判断函数,如果输入的用户名和密码都是 123 ,那么就会通过验证,自动跳转到 /welcome 下,否则跳转到 /forbidden 。
此时再运行项目,输入用户名密码后就会跳转到正确的页面了。

链接数据库

如果将用户名和密码写死的话,再次修改就会很麻烦,所以我们要用到数据库,将所有的数据保存在其中,便于我们查询、修改。
自行安装 mysql 数据库,随后启动并进入 mysql 。

    # 启动mysql服务
    $ mysqld
    # 用username这个用户登陆mysql,验证方式为密码
    $ mysql -u root -p

以下是测试环境

create database flask_demo;
use flask_demo;
create table user_table(
    u_username varchar(30) not null,
    u_password varchar(30) not null,
    primary key (u_username)
);
insert into user_table values ('admin','passwd');

python 连接数据库,并重写 true_or_false() 函数

from pymysql import connect
from pymysql import cursors

conn = connect(
    user='username', # 换成mysql的用户名
    password='password', # 换成mysql中该用户对应的密码
    db='flask_demo',
    charset='utf8',
    use_unicode=True,
    cursorclass=cursors.DictCursor
)

@app.route('/redirect')
def true_of_false():
    with conn.cursor() as cur:
        cur.execute("SELECT u_password FROM user_table WHERE u_username='{}'".format(request.args['id_username']))
        if cur.fetchone()['u_password'] == request.args['id_password']:
            return redirect('/welcome')
        return redirect('/forbidden')

说在后边

虽然这个项目实现了登陆,但是只要直接访问 url/welcome 就可以直接访问登陆后的网址,导致了这个网站非常的危险。对此我们可以在登陆后的人request中保存一条信息,如果未检测到可通过测试的信息,就直接跳转到登陆页面。

发表评论

电子邮件地址不会被公开。 必填项已用*标注