当前位置:网站首页>Flask framework
Flask framework
2022-08-02 14:20:00 【Spaghetti Mixed with No. 42 Concrete】
Flask框架
1、flask框架初识
Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务,
在介绍FlaskLet's talk about it firstDjango的联系以及区别,djangoA large and comprehensiveweb框架,It has many built in
模块,flaskIs a small but fine lightweight framework,Django功能大而全,Flask只包含基本的配置, Django的
One-stop solution idea,能让开发者不用在开发之前就在选择应用的基础设施上花费大量时间.Django
有模板,表单,路由,基本的数据库管理等等内建功能.与之相反,Flask只是一个内核,默认依赖
于2个外部库: Jinja2 模板引擎和 WSGI工具集--Werkzeug , flaskThe usage features are basically all tools
Usage depends on the imported form to extend,flask只保留了web开发的核心功能.
WSGI(web服务器网关接口)是pythonused to specifyweb服务器如何与python Web服务器如何与Python
WebProcedures to communicate standards,本质上就是一个socket服务端.而 Werkzeug模块 就是WSGI一个具体的
实现
关键词:一个Pythonwrite microweb框架 One core two libraries( Jinja2 模板引擎 和 WSGI工具集)
2、为什么要有flask
flaskThe performance is basically satisfactoryweb开发的需求, And flexibility and scalability are better than othersweb框架, The compatibility with various databases is very high
关键词
- The performance basically meets the requirements
- Flexibility and scalability
- The compatibility with various databases is relatively high
- 在真实生产环境下,小项目开发快,Flexible design for large projects
3、第一个flask程序
from flask import Flask
""" Import our installedflask包,通过flask包导入Flask类,Flask类即为Flask的核心,实例化这个Flaskclass to an instantiated objectapp. __name__this special parameter:PythonIt will be assigned according to the module it is in__name__the corresponding value of the variable,对于我们的程序来说(app.py),这个值为app. """
app = Flask(__name__)
""" @app.route('/')就是用来匹配url的,在我们的flaskIt is implemented with decorators,The decorator refers to the object that we instantiated the core class above. """
@app.route('/')
def index():
return 'hello flask!'
""" app.run()实现了flaskThe program runs in the development environment,并且默认ip和端口是127.0.0.1:5000 The specific content can be found in the source coderun方法可以看到 """
if __name__ == '__main__':
app.run()
4、 Werkzeug简介
Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库.这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包,官方的介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等 .
from werkzeug.wrappers import Request, Response
@Request.application
def hello(request):
return Response('Hello World!')
if __name__ == '__main__':
from werkzeug.serving import run_simple
run_simple('localhost', 4000, hello)
flaskIt depends on thiswerkzeug模块,由wekzeug模块实现了socket服务端的功能,helloIt must be run with parentheses,才会执行hello里面的代码,而在我们的flask中app.run()会调用run_simple(host, port, self, **options)
Take the above code examplehello替换成了self也就是app.app()会触发Flask类的__call__
方法.
所以所flaskThe entry to the program is there__call__
方法中,而__call__
方法返回self.wsgi_app(environ, start_response)
,So the execution of the entire program is there self.wsgi_app(environ, start_response)
中.
1 app.run() 调用 werkzeug.serving的run_simple(host, port, self, **options)
2 self()等价于app(), app()调用Flask类的__call__方法
3 Flask类的__call__方法返回了 self.wsgi_app(environ, start_response)
4 flaskThe execution of the program is all there self.wsgi_app(environ, start_response)中
关键词:
- Werkzeug是一个WSGI工具包,本质上是一个socket服务端.
- flask基于Werkzeug,flask只保留了web开发的核心功能.
- flaskThe execution process is there
def wsgi_app(self, environ, start_response):
中
5、登录,显示用户信息案例
app.py
from flask import Flask, request, render_template, redirect, session, jsonify
# flaskThe request object in is globalrequest
# render_template 就是django的render
app = Flask(__name__)
# 使用session,Be sure to set a secret key,等同于django配置文件中的密码
app.secret_key = 'adfae^^[email protected]@#$#'
app.debug = True # 启用调试模式,Modify the code without restarting,自动重启
USERS = {
1: {
'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
2: {
'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
3: {
'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
# request.form 等同于request.POST
name = request.form.get('user')
password = request.form.get('pwd')
if name == 'lqz' and password == '123':
# 登录成功,重定向到首页
# 把登录信息放到session中
session['name'] = name
return redirect('/')
else:
return jsonify({
'code': 101, 'msg': '用户名或密码错误'})
@app.route('/', methods=['GET'])
def index():
if session.get('name'):
return render_template('index.html', user_dict=USERS)
else:
# 没有登录,重定向到登陆页面
return redirect('/login')
# @app.route('/detail/<int:pk>', methods=['GET'])
# def detail(pk):
@app.route('/detail', methods=['GET'],endpoint='detail')
def detail():
print(request.query_string) # b'pk=1&name=lqz&age=19'
pk = int(request.args.get('pk'))
print(pk)
user_detail = USERS.get(pk)
return render_template('detail.html', info=user_detail)
if __name__ == '__main__':
app.run(port=8080)
### 总结
''' 0 The object of the current request,request对象是全局的,直接导入使用即可 1 前端post提交的数据,从flask中的:request.form中取 2 转换器的使用/detail/<int:pk> 3 Template syntax compatibledjango的dtl,You can use the function directly with parentheses,并且可以传参数 4 session也是全局对象,用户登录信息,放到session中 5 新手四件套 '字符串'---》HttpResonse('字符串') redirect('/')---》redirect('/') render_template()--->render() jsonify ---->JsonResponse() 5 前端get请求提交的数据,从request.args 6 request.query_string是get请求 ? 后面的内容,bytes格式 7 @app.route('/detail', methods=['GET'],endpoint='detail') endpoint等同于django路由中的name别名 '''
detail.html
<!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>
login.html
<!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>
index.html
<!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}}">查看详细1</a></td>
<td><a href="/detail?pk={
{k}}&name=lqz&age=19">查看详细2</a></td>
</tr>
{
% endfor %}
</table>
</body>
</html>
6、Flask配置文件
# flask.config.Config
方式一:直接写app.config['DEBUG'] 一般不用
方式二:放到py文件中 一般不用
方式三:通过环境变量 一般不用
app.config.from_envvar("环境变量名称")
app.config.from_json("json文件名称")
JSON文件名称,必须是json格式,因为内部会执行json.loads
app.config.from_mapping({
'DEBUG': True})
方式四: 通过类的方式 用的多
app.config.from_object('settings.DevelopmentConfig')
边栏推荐
- 第十一单元 序列化器
- MobileNet ShuffleNet & yolov5替换backbone
- 关于市场后市的发展预测? 2021-05-23
- 监管再次重拳出击,后市如何?2021-05-22
- [ROS] (06) ROS Communication - Topic Communication
- deal!It's July 30th!
- paddleocr window10 first experience
- [ROS] (05) ROS Communication - Node, Nodes & Master
- [ROS] (01) Create ROS workspace
- How to solve 1045 cannot log in to mysql server
猜你喜欢
使用云GPU+pycharm训练模型实现后台跑程序、自动保存训练结果、服务器自动关机
[ROS] The software package of the industrial computer does not compile
动态刷新日志级别
第十一单元 序列化器
第五单元 保持状态
如何解决mysql服务无法启动1069
8580 合并链表
How does Apache, the world's largest open source foundation, work?
Unit 11 Serializers
Deep learning framework pytorch rapid development and actual combat chapter4
随机推荐
监管再次重拳出击,后市如何?2021-05-22
动态刷新日志级别
【ROS】编译软件包packages遇到进度缓慢或卡死,使用swap
Minio文件上传
IDEA打包jar包
[ROS](03)CMakeLists.txt详解
[ROS]ROS常用工具介绍(待续)
How to solve 1045 cannot log in to mysql server
一维卷积神经网络_卷积神经网络的基础知识「建议收藏」
MySQL数据库语法格式
Flask请求应用上下文源码分析
动手学ocr(一)
(ROS) (03) CMakeLists. TXT, rounding
run yolov5
8581 线性链表逆置
[ROS] (04) Detailed explanation of package.xml
第三单元 视图层
hsql是什么_MQL语言
YOLOv7使用云GPU训练自己的数据集
期货具体是如何开户的?