当前位置:   article > 正文

[Flask] 初识Flask_python flask

python flask

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

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

pip install flask

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

目录结构

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

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

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

  1. # run.py
  2. # 导入Flask
  3. from flask import Flask
  4. # 创建Flask应用对象
  5. app = Flask(__name__)
  6. # 路由route + 视图函数
  7. # 使用route()装饰器告诉Flask什么样的URL能触发执行被装饰的函数
  8. # index()函数就是被装饰的视图函数,它返回显示在用户浏览器中的信息
  9. @app.route('/')
  10. def index():
  11. # 响应: 返回给浏览器的数据
  12. return 'Hello World!'
  13. # 使用run()函数来让应用运行在本地服务器上
  14. # 其中"if __name__ == '__main__':"确保服务器只会在该脚本被Python解释器直接执行的时候才会运行
  15. if __name__ == '__main__':
  16. app.run()
文件目录结构

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

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

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

Flask配置

① 开启debug模式

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

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

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

  1. # run.py
  2. from flask import Flask
  3. app = Flask(__name__)
  4. @app.route('/')
  5. def index():
  6. return 'Hello World!'
  7. if __name__ == '__main__':
  8. app.run(debug=True)

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

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

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

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

  1. # run.py
  2. from flask import Flask
  3. app = Flask(__name__)
  4. @app.route('/')
  5. def index():
  6. return 'Hello World!'
  7. if __name__ == '__main__':
  8. app.run(debug=True, port=8000)

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

③ 设置域名host

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

  1. # run.py
  2. from flask import Flask
  3. app = Flask(__name__)
  4. @app.route('/')
  5. def index():
  6. return 'Hello World!'
  7. if __name__ == '__main__':
  8. app.run(host="127.0.0.2", port=8888, debug=True)

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

④ 正确显示中文

  1. # run.py
  2. from flask import Flask
  3. app = Flask(__name__)
  4. @app.route('/')
  5. def index():
  6. return {"username":"安迪"}
  7. if __name__ == "__main__":
  8. app.run(debug=True)

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

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

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

app.config['JSON_AS_ASCII']=False 

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

  1. # run.py
  2. from flask import Flask
  3. app = Flask(__name__)
  4. app.config['JSON_AS_ASCII']=False
  5. @app.route('/')
  6. def index():
  7. return {"username":"安迪"}
  8. if __name__ == "__main__":
  9. app.run(debug=True)

结果如下图所示

提示Tips

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

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

  1. # config.py
  2. JSON_AS_ASCII=False

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

  1. from flask import Flask
  2. import config
  3. app = Flask(__name__)
  4. # 以后所有的配置项,全部放在config.py中
  5. app.config.from_object(config) # 表示从哪个对象中加载配置,我们把配置写到了config文件里
  6. @app.route('/')
  7. def index():
  8. return {"username":"安迪"}
  9. if __name__ == "__main__":
  10. app.run(debug=True)

结果如下图所示

route路由

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

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

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

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

  1. # run.py
  2. from flask import Flask
  3. app = Flask(__name__)
  4. # 设置动态URL"/user/<username>/info",<username>是变化的用户名
  5. @app.route('/user/<username>/info')
  6. def show_user_profile(username):
  7. # 显示该用户名的用户信息
  8. return f'这个是{username}的用户信息'
  9. # 设置动态URL"/post/<post_id>",<post_id>是变化的ID名,并且设置该ID只能为整数
  10. @app.route('/post/<int:post_id>')
  11. def show_post(post_id):
  12. # 根据ID显示文章,ID是整型类型
  13. return f'ID是: {post_id}'
  14. @app.route('/float/<float:money>')
  15. def get_float(money):
  16. print(type(money)) # <class 'float'>
  17. return str(money)
  18. # path: 支持/的字符串
  19. @app.route('/path/<path:name>')
  20. def get_path(name):
  21. print(type(name)) # <class 'str'>
  22. return str(name)
  23. @app.route('/getuuid')
  24. def get_uuid():
  25. import uuid
  26. return str(uuid.uuid4())
  27. @app.route('/uuid/<uuid:id>')
  28. def get_uuid2(id):
  29. print(type(id)) # <class 'uuid.UUID'>
  30. return str(id)
  31. # any: 从列出的项目中选择一个
  32. @app.route('/any/<any(apple, orange, banana):fruit>')
  33. def get_any(fruit):
  34. print(type(fruit)) # <class 'str'>
  35. return str(fruit)
  36. if __name__ == '__main__':
  37. 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

  1. # run.py
  2. from flask import Flask
  3. app = Flask(__name__)
  4. @app.route("/add1/")
  5. def add1():
  6. return f"路由的末尾有'/'"
  7. @app.route("/add2")
  8. def add2():
  9. return f"路由的末尾没有'/'"
  10. if __name__ == "__main__":
  11. 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

  1. # run.py
  2. from flask import Flask, url_for, jsonify
  3. app = Flask(__name__)
  4. app.config['JSON_AS_ASCII']=False
  5. books=[
  6. {"id":1, "name":"三国演义"},
  7. {"id":2, "name":"水浒传"},
  8. {"id":3, "name":"红楼梦"},
  9. {"id":4, "name":"西游记"},
  10. ]
  11. @app.route("/book/<int:book_id>")
  12. def book_detail(book_id):
  13. for book in books:
  14. if book_id == book["id"]:
  15. return book
  16. return "id为{}的图书没有找到".format(book_id)
  17. @app.route("/book/list")
  18. def book_list():
  19. for book in books:
  20. book["url"] = url_for("book_detail", book_id=book["id"])
  21. return jsonify(books)
  22. if __name__ == '__main__':
  23. 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"])

举个例子

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

GET请求和POST请求的区别

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

页面跳转和重定向

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

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

实例3:模拟登录

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

  1. from flask import Flask, url_for, redirect
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def index():
  5. return 'Hello World!'
  6. @app.route('/login')
  7. def login():
  8. # 模拟登录流程
  9. # flag = None
  10. flag = 'success'
  11. if flag:
  12. # 如果登录成功,跳转到首页
  13. return redirect(url_for('index'))
  14. else:
  15. # 如果登录失败,重定向到404页面
  16. re_url = 'https://qzonestyle.gtimg.cn/qzone/hybrid/app/404/'
  17. return redirect(re_url)
  18. if __name__ == '__main__':
  19. app.run(debug = True)

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/483349
推荐阅读
相关标签
  

闽ICP备14008679号