flask学习

打印 上一主题 下一主题

主题 548|帖子 548|积分 1644

flask学习

一、什么是flask

Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱接纳 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。Flask也被称为 “microframework” ,由于它使用简朴的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且轻易上手。它可以很好地结合MVC模式进行开发,开发人员分工互助,小型团队在短时间内就可以完乐成能丰富的中小型网站或Web服务的实现。别的,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简朴的同时实现功能的丰富与扩展,其强盛的插件库可以让用户实现个性化的网站定制,开发出功能强盛的网站。
二、背景

看这个框架介绍感觉云里雾里的, 其实就是假如你不会写java但是还要将做一些应用开发,例如文件上传大概前端数据展示。这个框架不要求有太强的java开发基础,由于它是python语言编写的,这样的话对咱做数据的就很友好了,究竟咱做数据湖那么久了python使用不能说为虎傅翼,但这个框架确实让我们如鱼得水了。
三、Flask构成



  • 路由(Routing):Flask 使用路由来定义 URL 和对应的处置惩罚函数。通过装饰器 @app.route(),可以将一个 URL 映射到相应的处置惩罚函数上,从而实现哀求的路由和处置惩罚。
  • 视图函数(View Functions):视图函数是 Flask 中处置惩罚哀求的核心组件,它接收哀求并返反响应。视图函数通常被装饰器绑定到特定的 URL 路由上。
  • 哀求上下文(Request Context):Flask 在处置惩罚哀求时会创建一个哀求上下文,其中包含了哀求的信息,例如哀求的方法、URL 参数、表单数据等。视图函数可以通过 request 对象来访问哀求上下文中的数据。
  • 响应对象(Response Object):视图函数需要返回一个响应对象,用于向客户端返回数据。Flask 提供了 make_response() 函数和 Response 类来构造响应对象,也可以直接返回字符串、模板渲染效果等。
  • 模板引擎(Template Engine):Flask 默认使用 Jinja2 模板引擎来渲染 HTML 页面。模板引擎答应开发者在模板中嵌入动态内容,从而将数据和视图分离,使页面更加灵活和易于维护。
  • 上下文全局变量(Context Globals):Flask 提供了一些上下文全局变量,例如 current_app 和 g,可以在视图函数中使用。current_app 表示当前应用的实例,g 是一个全局变量字典,可以在同一哀求中共享数据。
  • 扩展(Extensions):Flask 的功能可以通过扩展来增强,例如数据库支持、表单验证、用户认证等。Flask 社区提供了大量的扩展,使开发者能够更方便地添加功能。
  • 蓝图(Blueprint):蓝图是一种将 Flask 应用分割为小模块的方式,可以将相干的路由和视图函数构造在一个蓝图中,使应用更加结构化和易于管理。

四、运用

4.1、helloworld

  1. from flask import Flask, request, jsonify, render_template, redirect
  2. # 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容
  3. app = Flask(__name__)
  4. # 在Flask中,通过@app.route装饰器来表示路由
  5. @app.route("/")
  6. def index():
  7.     return "Hello World!"
  8. # 启动http服务
  9. if __name__ == '__main__':
  10.     # 默认端口5000  
  11.     app.run(debug=True)
  12.     # app.run(debug=True,port=6666) 自定义端口为6666
复制代码
在欣赏器输入
  1. http://127.0.0.1:5000
复制代码
可以看到helloworld
4.2、哀求方式

methods用于指定答应的哀求方式,默认是get哀求
  1. from flask import Flask, request, jsonify, render_template, redirect
  2. app = Flask(__name__)
  3. @app.route("/hello", methods=['GET', 'POST'])
  4. def hello():
  5.     return "Hello Mr,Tree!"
  6. # 启动http服务
  7. if __name__ == '__main__':
  8.     app.run(debug=True)
复制代码
哀求方式阐明底层GET从指定的资源哀求数据欣赏器会把 http header 和 data 一并发送出去,服务器响应 200 (返回数据)表示乐成POST向指定的资源提交要被处置惩罚的数据。欣赏器先发送 header,服务器响应 100, 欣赏器再继续发送 data,服务器响应 200 (返回数据)
  1. from flask import Flask, request, jsonify, render_template, redirect
  2. app = Flask(__name__)
  3. # 默认请求方式为 GET
  4. @app.route("/index/request")
  5. def index_request():
  6.     if request.method == 'GET':
  7.         return 'GET'
  8.     elif request.method == 'POST':
  9.         return 'POST'
  10. # 启动http服务
  11. if __name__ == '__main__':
  12.     app.run(debug=True)
复制代码
访问
  1. http://127.0.0.1:5000
  2. /index/request
复制代码
表现
GET
4.3、参数

4.3.1、在roote中指定多个参数

  1. from flask import Flask, request, jsonify, render_template, redirect
  2. app = Flask(__name__)
  3. # 指定固定格式的参数类型(此处制定了两个参数)
  4. @app.route("/index/<int:id>/<name>", methods=['GET', 'POST'])
  5. def index(id, name):
  6.         return f'{id} = {name}'
  7. # 启动http服务
  8. if __name__ == '__main__':
  9.     app.run(debug=True)
复制代码
参数阐明string字符串类型,可以是恣意字符int整数类型float浮点数类型path类似于字符串类型,但可以包含斜杠(/)uuidUUID(通用唯一标识符)类型 访问
  1. http://127.0.0.1:5000
  2. /index/1/king
复制代码
网页表现
1 = king
4.3.2、传入参数为路径

  1. from flask import Flask, request, jsonify, render_template, redirect
  2. app = Flask(__name__)
  3. # 指定固定格式的参数类型(此处制定了两个参数)
  4. @app.route('/index/files', methods=['GET'])
  5. def get_parameter():
  6.     path = request.args.get('path')
  7.     # 使用path进行相关操作
  8.     return 'Path: {}'.format(path)
  9. # 启动http服务
  10. if __name__ == '__main__':
  11.     app.run(debug=True)
复制代码
访问
  1. http://127.0.0.1:5000
  2. /index/files?path=/tmp/load
复制代码
网页表现
Path: /tmp/load
4.3.3、传入参数为数组

  1. from flask import Flask, request, jsonify, render_template, redirect
  2. app = Flask(__name__)
  3. @app.route('/index/names', methods=['GET'])
  4. def get_parameter():
  5.     names = request.args.getlist('names')
  6.     return f'Names: {names}'
  7. # 启动http服务
  8. if __name__ == '__main__':
  9.     app.run(debug=True)
复制代码
访问
  1. http://127.0.0.1:5000
  2. /index/names?names=a&names=b
复制代码
网页表现
Names: [‘a’, ‘b’]
4.4.4、返回 json 给前端

  1. from flask import Flask, jsonify
  2. app = Flask(__name__)
  3. # 返回json数据给前端
  4. @app.route("/index/json")
  5. def index():
  6.     data = {
  7.         'name': 'Tree'
  8.     }
  9.     return jsonify(data)
  10. # 启动http服务
  11. if __name__ == '__main__':
  12.     app.run()
复制代码
访问
  1. http://localhost:5000/index/json
复制代码
表现
  1. {
  2.   "name": "Tree"
  3. }
复制代码
4.4.5、动态url构建

动态选择,根据url传入参数的不同,动态跳转到不通的url
  1. from flask import Flask, request, jsonify, render_template, redirectapp = Flask(__name__)@app.route('/a')def get_a():    return 'Hello a'@app.route('/other/<string:name>')def get_other(name):    return f'Hello {name}'@app.route('/index/<name>')def get_parameter(name):    # 当传入参数为a时自动跳转毗连到 http://127.0.0.1:5000
  2. /a    if name == 'a':        return redirect(url_for('get_a'))    else:        return redirect(url_for('get_other', name=name))es}'# 启动http服务if __name__ == '__main__':    app.run(debug=True)
复制代码
访问
  1. http://127.0.0.1:5000
  2. /index/a
复制代码
url自动跳转到
  1. http://127.0.0.1:5000
  2. /a
复制代码
访问
  1. http://127.0.0.1:5000
  2. /index/b
复制代码
url自动跳转到
  1. http://127.0.0.1:5000
  2. /other/b
复制代码
4.4、模板

python代码天生html会较为复杂,但是可以通过render_template()函数渲染HTML文件。
render_template(‘html名称’),这样会在python模块的同级目录下探求templetes文件夹内中的html名称对应的文件进行渲染。
现有目录如下:
– test.py
– remplates
|
– 基金收盘价.html
  1. from flask import Flask, request, jsonify, render_template, redirect
  2. app = Flask(__name__)
  3. @app.route('/index')
  4. def get_template():
  5.     return render_template('基金收盘价.html')
  6. # 启动http服务
  7. if __name__ == '__main__':
  8.     app.run(debug=True)
复制代码
访问
  1. http://127.0.0.1:5000
  2. /index
复制代码
表现
基金收盘价.html 页面
4.5、钩子函数

有时候我们需要在正常访问的前后固定执行某些操纵,这个就用到了钩子函数,只需要为需要执行的方法添加装饰器即可
  1. from flask import Flask, request, jsonify, render_template, redirect
  2. app = Flask(__name__)
  3. # 发起请求之前执行此方法
  4. @app.before_request
  5. def before_request_a():
  6.     print('before_request_a')
  7. # 请求结束以后执行此方法
  8. @app.after_request
  9. def after_request_a(response):
  10.     print('after_request_a')
  11.     # 装饰器接收response参数,运行完必须归还response,否则程序报错
  12.     return response)
  13. @app.route("/hello", methods=['GET', 'POST'])
  14. def hello():
  15.     return "Hello Mr,Tree!"
  16. # 启动http服务
  17. if __name__ == '__main__':
  18.     app.run(debug=True)
复制代码
参数运行时阐明before_first_request哀求之前仅第一次哀求前会被调用before_request哀求之前每一次哀求前都会被调用after_request哀求之后每一次哀求之后都会调用(没有未处置惩罚异常的情况)teardown_request哀求之后每一次哀求之后都会调用(有无异常都可以,debug模式关闭) 4.6、文件上传

1、创建一个enctype属性设置为’multipart/form-data’的HTML表单,并提交到指定的URL
2、 URL处置惩罚步伐从request.files[]对象中提取文件并将其保存到所需的位置,每个文件上传会先传输到临时位置,上传完毕后保存到目标位置。
文件上传的临时目录默认是由 Werkzeug(Flask 底层使用的 WSGI 工具集)和底层操纵体系控制的。
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>Flask示例</title>
  5. </head>
  6.     <body>
  7.       <form action = "http://localhost:5000/index/upload" method = "POST"
  8.           enctype = "multipart/form-data">
  9.           <input type = "file" name = "file" />
  10.           <input type = "submit" value="提交"/>
  11.        </form>
  12.     </body>
  13. </html>
复制代码
  1. import os
  2. from flask import Flask, request, render_template
  3. app = Flask(__name__)
  4. # 指定文件上传的路径
  5. app.config['UPLOAD_FOLDER'] = './uploads'
  6. @app.route('/index/upload', methods=['GET', 'POST'])
  7. def upload_file():
  8.     if request.method == 'POST':
  9.         f = request.files['file']
  10.         print(request.files)
  11.         file_path = os.path.join(app.config['UPLOAD_FOLDER'], f.filename)
  12.         f.save(file_path)
  13.         return 'file uploaded successfully'
  14.     else:
  15.         return render_template('upload.html')
  16. # 启动http服务
  17. if __name__ == '__main__':
  18.     app.run()
复制代码
4.7、邮件发送

需要先安装邮件发送的第三方包
  1. pip install Flask-Mail
复制代码
案例
  1. from flask import Flask
  2. from flask_mail import Mail, Message
  3. app =Flask(__name__)
  4. mail=Mail(app)
  5. app.config['MAIL_SERVER']='邮件服务器的名称/IP地址'
  6. app.config['MAIL_PORT'] = 所用服务器的端口号
  7. app.config['MAIL_USERNAME'] = '发件人的用户名'
  8. app.config['MAIL_PASSWORD'] = '发件人的用户密码'
  9. app.config['MAIL_USE_TLS'] = False
  10. app.config['MAIL_USE_SSL'] = True
  11. mail = Mail(app)
  12. @app.route("/index/mail")
  13. def index():
  14.     msg = Message('邮件文本', sender='邮件发送人的邮箱', recipients=['收件人邮箱'])
  15.     msg.body = "Hello Flask message sent from Flask-Mail"
  16.     mail.send(msg)
  17.     return "Sent"
  18. if __name__ == '__main__':
  19.     app.run(debug=True)
复制代码
4.7.1、邮件发送设置参数阐明

参数阐明MAIL_SERVER邮件服务器的名称/IP地址MAIL_PORT所用服务器的端标语MAIL_USE_TLS启用/禁用传输安全层加密MAIL_USE_SSL启用/禁用安全接字层加密MAIL_DEBUG调试支持,默认是Flask应用步伐的调试状态MAIL_USERNAME发件人的用户名MAIL_PASSWORD发件人的密码MAIL_DEFAULT_SENDER设置默认发件人MAIL_MAX_EMAILS设置要发送的最大邮件MAIL_SUPPRESS_SEND假如app.testing设置为true,则发送被克制MAIL_ASCII_ATTACHMENTS假如设置为true,则将附加的文件名转换为ASCII 4.7.2、Mail方法阐明

方法阐明send()发送Message类对象的内容connect()与邮件主机打开毗连send_message()发送消息对象 4.7.3、Message类方法阐明

方法参数阐明attach()向消息添加附件filename要附加的文件的名称content_type文件的MIME类型data原始文件数据disposition内容处置惩罚add_recipient()向消息添加另一个收件人(抄送)
  1. |
复制代码
|
send_message() |
发送消息对象 |

4.7.3、Message类方法阐明

方法参数阐明attach()向消息添加附件filename要附加的文件的名称content_type文件的MIME类型data原始文件数据disposition内容处置惩罚add_recipient()向消息添加另一个收件人(抄送)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表