初始Flask以及简单地上手应用

Posted 骑着哈哥去旅行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初始Flask以及简单地上手应用相关的知识,希望对你有一定的参考价值。


对,你没有看错,上图就代表Flask。那么Flask为何方神物?

Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。

相对于同类框架,Flask框架显得更为灵活,轻便,安全且极容易上手

一,上手之前先配置环境变量

Windows用户直接在dos窗口或pycharm下面的Terminal中输入如下命令即可:

pip install flask

二,一个例子说明Flask ‘’ 在何处?

注:建议新建一个python项目

from flask import Flask

app = Flask(__name__)  # 创建一个Flask对象


@app.route('/study')  # 使用 route() 装饰器来告诉 Flask 触发函数的 URL
def study():
    return "<h1>Hello Word!</h1>"


app.run()  # 启动服务

pycharm中直接右键run运行即可


注:从上图运行结果可知Flask的默认端口为5000, 而Django的默认端口为8000, Tornado的默认端口为8888;

寥寥六行代码,即可跑起来,你敢说它不‘轻’?

三,简单地上手一个用户管理系统

其实,假如你对Django框架有所了解,再学习Flask便会显得十分从容。

1,实现简单地用户登录

from flask import Flask, request, render_template

app = Flask(__name__)  # 创建一个Flask对象


@app.route('/login', methods=['GET', 'POST', ])  # mothods=['GET', 'POST', ] 表示既可以发送GET请求,也可以发送POST请求
def login():
    if request.method == "GET":  # 如果发送的是GET请求
        return render_template('login.html')  # 使用 render_template() 方法可以渲染模板,相当于Django中的render()
    else:
        user = request.form.get('username')  # request.form.get()表示通过post方式获取值
        pwd = request.form.get('password')
        if user == 'hpl' and pwd == '123456':
            return "<h1>恭喜您登录成功!</h1>"
        else:
            return render_template('login.html', error='用户名或密码错误!')


app.run(debug=True)  # 启动服务 debug=True 表示启动debug调式

在根目录下创建一个名为templates的文件夹,用户放置模板(和Django中类似);并在下面创建一个login.html文件,其中的内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>欢迎来到登陆页面</title>
</head>
<body>
<h1>登录</h1>
<form action="" method="post">
    <p>
        <label for="">用户名:</label>
        <input type="text" name="username">
    </p>
    <p>
        <label for="">密码:</label>
        <input type="password" name="password">
        <span style="color:red;"> error </span>
    </p>
    <button>提交</button>
</form>
</body>
</html>

run一下,结果为:

当用户名或密码错误时:

当用户名和密码正确时:

2,将用户的登录信息放入session中

from flask import Flask, request, render_template, session

app = Flask(__name__)  # 创建一个Flask对象
app.secret_key = 'jkdfgd'  # 相当于加盐(里面的内容随便写)


@app.route('/login', methods=['GET', 'POST', ])  # mothods=['GET', 'POST', ] 表示既可以发送GET请求,也可以发送POST请求
def login():
    if request.method == "GET":  # 如果发送的是GET请求
        return render_template('login.html')  # 使用 render_template() 方法可以渲染模板,相当于Django中的render()
    else:
        user = request.form.get('username')  # request.form.get()表示通过post方式获取值
        pwd = request.form.get('password')
        # 将用户信息放入session
        session['user_information'] = user
        if user == 'hpl' and pwd == '123456':
            return "<h1>恭喜您登录成功!</h1>"
        else:
            return render_template('login.html', error='用户名或密码错误!')


app.run(debug=True)  # 启动服务 debug=True 表示启动debug调式

再次登录后,如下图

3,显示用户基本信息和详情信息

from flask import Flask, request, render_template, session, redirect

USER_DICT = 
    '1': 'name': '光头强', 'age': 30, 'sex': '男', 'address': '团结屯',
    '2': 'name': '大马猴', 'age': 25, 'sex': '男', 'address': '未知',
    '3': 'name': '二狗子', 'age': 26, 'sex': '男', 'address': '未知',
    '4': 'name': '李老板', 'age': 42, 'sex': '男', 'address': '大都市',
    '5': 'name': '翠花', 'age': 18, 'sex': '女', 'address': '森林',


app = Flask(__name__)  # 创建一个Flask对象
app.secret_key = 'jkdfgd'  # 相当于加盐(里面的内容随便写)


@app.route('/login', methods=['GET', 'POST', ])  # mothods=['GET', 'POST', ] 表示既可以发送GET请求,也可以发送POST请求
def login():
    if request.method == "GET":  # 如果发送的是GET请求
        return render_template('login.html')  # 使用 render_template() 方法可以渲染模板,相当于Django中的render()
    else:
        user = request.form.get('username')  # request.form.get()表示通过post方式获取值
        pwd = request.form.get('password')
        # 将用户信息放入session
        session['user_information'] = user
        if user == 'hpl' and pwd == '123456':
            return redirect('/index')  # 重定向(和Django中类似)
        else:
            return render_template('login.html', error='用户名或密码错误!')


@app.route('/index', methods=['GET', ], endpoint='index')  # 同Django中的name,用于反向解析
def index():
    user_info = session.get('user_information')
    if not user_info:
        return redirect('/login')

    return render_template('index.html', user_dict=USER_DICT)


@app.route('/detail', methods=['GET', ], endpoint='detail')
def detail():
    user_info = session.get('user_information')
    if not user_info:
        return redirect('/login')
    user_id = request.args.get('user_id')
    info = USER_DICT.get(user_id)
    return render_template('detail.html', info=info)


app.run(debug=True)  # 启动服务 debug=True 表示启动debug调式

在templates文件夹下创建index.html文件和detail.html文件

index.html中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户信息</title>
</head>
<body>
<h2>用户信息</h2>
<table border="1px" cellspacing="0" cellpadding="5px">
    <thead>
    <tr>
        <th>姓名</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    % for k,v in user_dict.items() %
    <tr>
        <td> v.name </td>
        <td><a href="/detail?user_id= k ">查看详情</a></td>
    </tr>
    % endfor %
    </tbody>
</table>
</body>
</html>

detail.html中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>信息详情展示页</title>
</head>
<body>
<h1>详情信息</h1>
<table border="1px" cellpadding="5px" cellspacing="0">
    <thead>
    <tr>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
        <th>住址</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td> info.name </td>
        <td> info.age </td>
        <td> info.sex </td>
        <td> info.address </td>
    </tr>
    </tbody>
</table>
</body>
</html>

结果为

4,退出登录

from flask import Flask, request, render_template, session, redirect

USER_DICT = 
    '1': 'name': '光头强', 'age': 30, 'sex': '男', 'address': '团结屯',
    '2': 'name': '大马猴', 'age': 25, 'sex': '男', 'address': '未知',
    '3': 'name': '二狗子', 'age': 26, 'sex': '男', 'address': '未知',
    '4': 'name': '李老板', 'age': 42, 'sex': '男', 'address': '大都市',
    '5': 'name': '翠花', 'age': 18, 'sex': '女', 'address': '森林',


app = Flask(__name__)  # 创建一个Flask对象
app.secret_key = 'jkdfgd'  # 相当于加盐(里面的内容随便写)


@app.route('/login', methods=['GET', 'POST', ])  # mothods=['GET', 'POST', ] 表示既可以发送GET请求,也可以发送POST请求
def login():
    if request.method == "GET":  # 如果发送的是GET请求
        return render_template('login.html')  # 使用 render_template() 方法可以渲染模板,相当于Django中的render()
    else:
        user = request.form.get('username')  # request.form.get()表示通过post方式获取值
        pwd = request.form.get('password')
        # 将用户信息放入session
        session['user_information'] = user
        if user == 'hpl' and pwd == '123456':
            return redirect('/index')
        else:
            return render_template('login.html', error='用户名或密码错误!')


@app.route('/index', methods=['GET', ], endpoint='index')
def index():
    user_info = session.get('user_information')
    if not user_info:
        return redirect('/login')

    return render_template('index.html', user_dict=USER_DICT)


@app.route('/detail', methods=['GET', ], endpoint='detail')
def detail():
    user_info = session.get('user_information')
    if not user_info:
        return redirect('/login')
    user_id = request.args.get('user_id')
    info = USER_DICT.get(user_id)
    return render_template('detail.html', info=info)


@app.route('/logout', methods=['GET', ])
def logout():
    del session['user_information']  # 删除session即可退出登录
    return redirect('/login')


app.run(debug=True)  # 启动服务 debug=True 表示启动debug调式

更多详细内容,见Flask开发文档:https://dormousehole.readthedocs.io/en/latest/

以上是关于初始Flask以及简单地上手应用的主要内容,如果未能解决你的问题,请参考以下文章

《flask》flask+mqtt联动快速上手

《flask》flask+mqtt联动快速上手

Flak快速上手

Flask API 文档管理与 Swagger 上手

Flask简介——Flask教程

快速上手 WebAssembly 应用开发:Emscripten 使用入门