[Flask] 初识Flask

Flask是一个使用Python编写的轻量级Web应用框架

为了更好地管理Python应用,通常情况下都会在虚拟环境中安装Flask框架。在虚拟环境下,使用如下命令安装Flask

pip install flask

我们可以直接使用pycharm工具创建虚拟环境,只需要在创建项目的时候勾选创建虚拟环境即可

目录结构

 使用pip install flask命令安装Flask框架

Flask框架安装完成后,就可以开始编写第一个Flask程序

在资源目录下创建一个run.py文件,代码如下所示

# run.py
# 导入Flask
from flask import Flask
# 创建Flask应用对象
app = Flask(__name__)

# 路由route + 视图函数
# 使用route()装饰器告诉Flask什么样的URL能触发执行被装饰的函数
# index()函数就是被装饰的视图函数,它返回显示在用户浏览器中的信息
@app.route('/')
def index():
    # 响应: 返回给浏览器的数据
    return 'Hello World!'

# 使用run()函数来让应用运行在本地服务器上
# 其中"if __name__ == '__main__':"确保服务器只会在该脚本被Python解释器直接执行的时候才会运行
if __name__ == '__main__':
    app.run()
文件目录结构

运行run.py文件,运行成功后效果如下图所示

然后在浏览器中,输入网址http://127.0.0.1:5000,运行效果如下图所示

按"CTRL + C"组合键就可以关闭服务 

Flask配置

① 开启debug模式

如果我们对代码进行了修改,就得重新启动程序以及加载url,这样显然比较繁琐,此时我们可以启用Flask调试模式解决上述问题,开启debug模式后,修改过的Python代码会自动重启

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

我们对上面的run.py文本进行修改,开启debug模式 

# run.py
from flask import Flask
app = Flask(__name__)


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


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

运行run.py文件,运行成功后效果如下图所示

② 设置服务器的端口号port(默认是5000)

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

我们再对上面的run.py文本进行修改,设置端口号为8000

# run.py
from flask import Flask
app = Flask(__name__)


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


if __name__ == '__main__':
    app.run(debug=True, port=8000)

启动服务后,在浏览器中输入网址http://127.0.0.1:8000,运行效果如下图所示

③ 设置域名host

默认是127.0.0.1,指定为0.0.0.0代表本机所有ip

# run.py
from flask import Flask
app = Flask(__name__)


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


if __name__ == '__main__':
    app.run(host="127.0.0.2", port=8888, debug=True)

启动服务后,在浏览器中输入网址http://127.0.0.2:8888,运行效果如下图所示

④ 正确显示中文

# run.py
from flask import Flask
app = Flask(__name__)


@app.route('/')
def index():
    return {"username":"安迪"}


if __name__ == "__main__":
    app.run(debug=True)

上述代码运行成功后,中文会出现乱码的情况 

如何让其显示为正确的中文呢?

这里我们需要修改配置文件,flask项目的配置都是通过app.config对象来进行配置操作的,显示中文乱码与JSON_AS_ASCII有关,默认为True,这里我们修改为False就可以解决上述中文乱码问题

app.config['JSON_AS_ASCII']=False 

我们对上述代码进行编辑修改 

# run.py
from flask import Flask
app = Flask(__name__)
app.config['JSON_AS_ASCII']=False

@app.route('/')
def index():
    return {"username":"安迪"}


if __name__ == "__main__":
    app.run(debug=True)

结果如下图所示

提示Tips

如果我们需要写的app.config配置过多,可以将所有的配置项都放在一个模块里,然后通过加载模块的方法进行配置 

我们将配置全部写在config文件里,config.py文件内容如下

# config.py
JSON_AS_ASCII=False

run.py文件程序里,我们进行加载模块 

from flask import Flask
import config
app = Flask(__name__)
# 以后所有的配置项,全部放在config.py中
app.config.from_object(config)  # 表示从哪个对象中加载配置,我们把配置写到了config文件里


@app.route('/')
def index():
    return {"username":"安迪"}


if __name__ == "__main__":
    app.run(debug=True)

结果如下图所示

route路由

@app.route()函数中添加URL时,这里的URL有时是变化的。例如,商品详情页面的商品ID是变化的,个人中心页面的用户名称是变化的。针对这种情况,可以构造含有动态部分的URL,也可以在一个函数上附着多个规则

要给URL添加变量部分,可以把这些特殊的字段标记为<变量名>的形式,它将会作为命名参数传递到函数。如果要对变量名的类型进行限制,则可以使用<变量类型:变量名>指定一个可选的类型转换器

常用的变量类型
类型描述说明
string接受任何不包含斜杠的文本(默认)
int接受正整数
float接受正浮点数
path类似string,但可以包含斜杠
uuid接受UUID字符串(唯一码,一种生成规则)
any可以同时指定多种路径,进行限定

实例1:根据不同的用户名参数,输出相应的用户信息

# run.py
from flask import Flask
app = Flask(__name__)


# 设置动态URL"/user/<username>/info",<username>是变化的用户名
@app.route('/user/<username>/info')
def show_user_profile(username):
    # 显示该用户名的用户信息
    return f'这个是{username}的用户信息'


# 设置动态URL"/post/<post_id>",<post_id>是变化的ID名,并且设置该ID只能为整数
@app.route('/post/<int:post_id>')
def show_post(post_id):
    # 根据ID显示文章,ID是整型类型
    return f'ID是: {post_id}'


@app.route('/float/<float:money>')
def get_float(money):
    print(type(money))  # <class 'float'>
    return str(money)


# path: 支持/的字符串
@app.route('/path/<path:name>')
def get_path(name):
    print(type(name))  # <class 'str'>
    return str(name)


@app.route('/getuuid')
def get_uuid():
    import uuid
    return str(uuid.uuid4())


@app.route('/uuid/<uuid:id>')
def get_uuid2(id):
    print(type(id))  # <class 'uuid.UUID'>
    return str(id)


# any: 从列出的项目中选择一个
@app.route('/any/<any(apple, orange, banana):fruit>')
def get_any(fruit):
    print(type(fruit))  # <class 'str'>
    return str(fruit)


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

运行run.py文件,当访问http://127.0.0.1:5000/user/andy/info时,运行结果如下图所示

当访问http://127.0.0.1:5000/user/jack/info时,运行结果如下图所示

当访问http://127.0.0.1:5000/post/1时,运行结果如下图所示

当访问http://127.0.0.1:5000/post/one时,由于one不是整数,无法匹配该路由,则会提示"Not Found",运行结果如下图所示

当访问http://127.0.0.1:5000/float/120.1时,运行结果如下图所示

当访问http://127.0.0.1:5000/float/120时,运行结果如下图所示 

当访问http://127.0.0.1:5000/path/hello/andy时,运行结果如下图所示  

当访问http://127.0.0.1:5000/getuuid时,运行结果如下图所示  

当访问http://127.0.0.1:5000/uuid/35c88e67-d362-40d8-aa76-a3a741c04a85时,运行结果如下图所示

当访问http://127.0.0.1:5000/any/orange时,运行结果如下图所示   

当访问http://127.0.0.1:5000/any/cherry时,运行结果如下图所示    

有时候我们在路径url末尾/不加/的时候,访问是一致的,但有些加了/访问又报错,Flask对路由尾部的/是有做处理的:

flask添加路由的尾部带有/:访问时加/和不加/效果是一样的

flask添加路由的尾部没有/:访问时加/访问会报错,未加/才能访问成功

实例2

# run.py
from flask import Flask
app = Flask(__name__)


@app.route("/add1/")
def add1():
    return f"路由的末尾有'/'"


@app.route("/add2")
def add2():
    return f"路由的末尾没有'/'"


if __name__ == "__main__":
    app.run(debug=True)

运行run.py文件,当访问http://127.0.0.1:5000/add1/时,运行结果如下图所示 

当访问http://127.0.0.1:5000/add1时,运行结果如下图所示  

当访问http://127.0.0.1:5000/add2时,运行结果如下图所示   

当访问http://127.0.0.1:5000/add2/时,运行结果如下图所示    

一般我们通过一个URL可以执行到某一个函数,如果反过来,我们知道一个函数,怎么去获得这个URL呢?

我们可以使用url_for()函数来给指定的函数构造URL(可理解为反向解析,通过视图函数名反过来找到路由),它的第一个参数是函数名,其余参数会添加到URL末尾作为查询参数

url_for('函数名', 参数名=value)

实例3

# run.py
from flask import Flask, url_for, jsonify
app = Flask(__name__)
app.config['JSON_AS_ASCII']=False

books=[
    {"id":1, "name":"三国演义"},
    {"id":2, "name":"水浒传"},
    {"id":3, "name":"红楼梦"},
    {"id":4, "name":"西游记"},
]


@app.route("/book/<int:book_id>")
def book_detail(book_id):
    for book in books:
        if book_id == book["id"]:
            return book
    return "id为{}的图书没有找到".format(book_id)


@app.route("/book/list")
def book_list():
    for book in books:
        book["url"] = url_for("book_detail", book_id=book["id"])
    return jsonify(books)


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

运行run.py文件,当访问http://127.0.0.1:5000/book/list时,运行结果如下图所示

指定HTTP方法 

@app.route()中可以传入一个关键字参数methods来指定支持的HTTP方法,HTTP方法告知服务器,客户端想对请求的页面做些什么

GET和POST方法使用的最多 

@app.route(rule,methods=["GET","POST","XXX","XXX"])

举个例子

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

GET请求和POST请求的区别

如果只是从服务器上获取数据,一般都是GET请求
如果前端需要把数据发送给服务器,一般用POST请求 

页面跳转和重定向

使用url_for()函数可以构造URL,所以它经常结合redirect()函数来跳转到构造的URL页面

url_for()函数和redirect()函数需要从Flask模块中导入

实例3:模拟登录

登录页面URL为"/login",首页页面URL为"/",代码如下所示

from flask import Flask, url_for, redirect
app = Flask(__name__)


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


@app.route('/login')
def login():
    # 模拟登录流程
    # flag = None
    flag = 'success'
    
    if flag:
        # 如果登录成功,跳转到首页
        return redirect(url_for('index'))
    else:
        # 如果登录失败,重定向到404页面
        re_url = 'https://qzonestyle.gtimg.cn/qzone/hybrid/app/404/'
        return redirect(re_url)
    


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

在浏览器中访问网址http://127.0.0.1:5000/login时,会调用login()方法。如果登录成功,则会使用redirect()函数跳转至index方法,也就是首页

Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理Flask简单整理
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值