Flask01--入门

1. 创建flask框架主程序

名字可以是app.py/run.py/main.py/index.py

from flask import Flask
app = Flask(__name__) 

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

if __name__ == '__main__':
    # 注意: flask默认端口5000
    app.run()

2. 代码分析

# 导入Flask类
from flask import Flask

"""
import_name      Flask程序所在的包(模块),传 __name__ 就可以
                 其可以决定 Flask 在访问静态文件时查找的路径
static_path      静态文件访问路径(不推荐使用,使用 static_url_path 代替)
static_url_path  静态文件访问路径,可以不传,默认为:/ + static_folder
static_folder    静态文件存储的文件夹,可以不传,默认为 static
template_folder  模板文件存储的文件夹,可以不传,默认为 templates
"""
app = Flask(import_name=__name__)


# 编写路由视图
# flask的路由是通过给视图添加装饰器的方式进行编写的。当然也可以分离到另一个文件中。
# flask的视图函数,flask中默认允许通过return返回html格式数据给客户端。
@app.route(rule='/')
def index():
    return '<mark>Hello Word!</make>'

# 加载项目配置
class Config(object):
    # 开启调试模式
    DEBUG = True

# flask中支持多种配置方式,通过app.config来进行加载,我们会这里常用的是配置类
app.config.from_object( Config )


# 指定服务器IP和端口
if __name__ == '__main__':
    # 运行flask
    app.run(host="0.0.0.0", port=5000)

3. 案例:登录,显示用户信息

main.py

Copyfrom flask import Flask, render_template, request, redirect, session, url_for

app = Flask(__name__)
app.debug = True  # 调试模式
app.secret_key = 'xxxx-xxxx-xxxx-xxxx'  # 跟djangosetting中的秘钥一个意思

USERS = {
    1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
    2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
    3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}


@app.route('/detail/<int:nid>', methods=['GET'])
def detail(nid):
    user = session.get('user_info')
    if not user:
        return redirect('/login')

    info = USERS.get(nid)
    return render_template('detail.html', info=info)


@app.route('/index', methods=['GET'])
def index():
    # 从session中拿出user_info
    user = session.get('user_info')
    if not user:
        # return redirect('/login')
        url = url_for('l1')  # 反向解析
        print(url)
        return redirect(url)
    return render_template('index.html', user_dict=USERS)


@app.route('/login', methods=['GET', 'POST'], endpoint='l1')  # endpoint路由的别名,用作反向解析
def login():
    if request.method == "GET":
        return render_template('login.html')
    else:
        # request.query_string
        # post提交过来的数据放在form中
        # get请求提交过来的数据query_string中
        user = request.form.get('user')w
        pwd = request.form.get('pwd')
        if user == 'lqw' and pwd == '123':
            # 往session中放入key和value
            session['user_info'] = user
            return redirect('/index')
        return render_template('login.html', error='用户名或密码错误')

# 分析源码以后的路由写法
def xxx():
    return 'xxx'


app.add_url_rule('/xxx', view_func=xxx)

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

detail.html

Copy<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>详细信息 {{ info.name }}</h1>
<div>
    {{ info.text }}
</div>
</body>
</html>

index.html

Copy<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<table>
    {% for k,v in user_dict.items() %}
        <tr>
            <td>{{ k }}</td>
            <td>{{ v.name }}</td>
            <td>{{ v['name'] }}</td>
            <td>{{ v.get('name') }}</td>
            <td><a href="/detail/{{ k }}">查看详细</a></td>
        </tr>
    {% endfor %}
</table>
</body>
</html>

login.html

Copy<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户登录</h1>
<form method="post">
    <input type="text" name="user">
    <input type="text" name="pwd">
    <input type="submit" value="登录">{{ error }}
</form>
</body>
</html>

4. 总结

# Flask三板斧:
    return '<mark>字符串</mark>'  # 提示: 支持HTML语法
    return render_template('index.html')
    return redirect('/login')

# 路由写法(路径,支持的请求方式,别名)
    # 基本的路由写法
    @app.route('/login',methods=['GET','POST'],endpoint='l1')
    # 分析源码以后的路由写法
    def xxx():
        return 'xxx'
    app.add_url_rule('/xxx', view_func=xxx)

# 模板语言渲染
    同dtl,但是比dtl强大,支持加括号执行,字典支持中括号取值和get取值

# 分组(django中的有名分组)
    @app.route('/detail/<int:nid>',methods=['GET'])
    def detail(nid):

# 反向解析
    url_for('别名')

# 获取前端传递过来的数据
    # get 请求
        request.query_string
    # post请求
        user = request.form.get('user')
        pwd = request.form.get('pwd')
永远不要高估自己
原文地址:https://www.cnblogs.com/liqiangwei/p/14401156.html