【星海出品】flask (四) 三方工具使用

2023-11-11 06:45

本文主要是介绍【星海出品】flask (四) 三方工具使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 学习的灵魂是公社,学习的目标是人民自治.
  2. 学习是非暴力革命方式的社会改革.
  3. 学习是人民对抗资本剥夺的文明方式.
  4. 学习失败了,就如同巴黎公社失败了一样.但是它为今后进行成功的社会改革指明了正确的方向.
  5. 学习的逻辑并不复杂,一句话,必须让知识数量与知识价值基本吻合.
  6. 管理学习也不复杂,就是要让学习的量稳定的波动于最小正值区间内.
  7. 当然,这在管理上是非常苦难的.
  8. 第一,我们必须有大量的前期积累.比如知识储备,知识变现能力,知识获取途径等等.
  9. 第二,我们必须严格控制知识的滥用.知识的滥教,确保知识的数量不背离知识的价值.
  10. 第三.我们必须建立强大的均输平准手段,以应对来自外部不确定的冲击.
  11. 总之,要站稳立场,要确立人民主体性,就一定可以管理好知识.
  12. 最后再一次向陈云等老一辈的无产阶级革命家表示敬意.
在开发时,每次更改 Flask 项目代码后,都需要手动重启 Flask 服务器。为了提高开发效率,可以使用 Flask 的自动重载功能,使 Flask 服务器能够自动检测到代码更改并自动重启。

具体实现方法如下:
在 Flask 项目的入口文件中,导入 werkzeug.serving 模块中的 run_simple 函数
Werkzeug 是一个 Python 的 WSGI 工具库,它可以用来构建 Web 应用程序。

from werkzeug.serving import run_simple

使用 run_simple 函数启动 Flask 服务器,并设置 use_reloader=True 表示启用自动重载:

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True, use_reloader=True)
from werkzeug.wrappers import Request, Response@Request.application
def application(request):return Response('Hello world')if __name__ == '__main__':from werkzeug.serving import run_simplerun_simple('localhost', 5000, application)

使用 @Request.application 装饰器将 application 函数转换为一个 WSGI 应用程序。然后使用
run_simple 函数在本地的 5000 端口运行应用程序。

def run_simple(hostname, port, application, use_reloader=False,use_debugger=False, use_evalex=True,extra_files=None, reloader_interval=1, threaded=False,processes=1, request_handler=None, static_files=None,passthrough_errors=False, ssl_context=None):# 这方法还是比较短的,但是注释写得很详细,由于篇幅问题,就把源码中的注释省略了if use_debugger:from werkzeug.debug import DebuggedApplicationapplication = DebuggedApplication(application, use_evalex)if static_files:from werkzeug.wsgi import SharedDataMiddlewareapplication = SharedDataMiddleware(application, static_files)def inner():make_server(hostname, port, application, threaded,processes, request_handler,passthrough_errors, ssl_context).serve_forever()if os.environ.get('WERKZEUG_RUN_MAIN') != 'true':display_hostname = hostname != '*' and hostname or 'localhost'if ':' in display_hostname:display_hostname = '[%s]' % display_hostname_log('info', ' * Running on %s://%s:%d/', ssl_context is Noneand 'http' or 'https', display_hostname, port)if use_reloader:# Create and destroy a socket so that any exceptions are raised before# we spawn a separate Python interpreter and lose this ability.test_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)test_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)test_socket.bind((hostname, port))test_socket.close()run_with_reloader(inner, extra_files, reloader_interval)else:inner()

模板渲染

虽然 jinja2 是一个单独的库,但是由于 flask 依赖了jinja2,所以不必单独安装。

 from flask import render_template

使用

 @app.route('/template')def template():  # put application's code here// 渲染return render_template('demo.html')

动态渲染
还是使用 jinja2 的 render_template
通过blog_id 与 HTML中 {{ blog_id }} 关联

 @app.route('/template/blog/<blog_id>')def template(blog_id):  # put application's code herereturn render_template('demo.html', blog_id=blog_id)
 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><title>Title</title></head><body><a href="www.baidu.com">百度</a><div class="header">这里是博客{{ blog_id }}</div></body></html>

支持其他类型的传参

 @app.route('/template/blog/<blog_id>')def template(blog_id):  # put application's code hereuesr = User('lijiajun', 'wy15195382735@163.com')person = {'username': 'zhangsan','email': 'zhangsan的email'}return render_template('demo.html', blog_id=blog_id, user=uesr, person=person)

demo.html

 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><title>Title</title></head><body><a href="www.baidu.com">百度</a><div class="header">这里是博客{{ blog_id }}</div><div>{{ user }}</div><div>{{ user.username }}</div><div>{{ user.email }}</div><div>{{ person.username }}</div><div>{{ user.email }}</div></body></html>

使用过滤器
使用管道符号 | 即可。 <div>{{ user.email | length }}</div>

自定义过滤器

 def filter(value):return value.upper()​​# 增加过滤器app.add_template_filter(filter, 'filter')<div>{{ user.email | filter }}</div>

jinja2的语句

<div>{% if age > 18 %}可以进入 {% endif %} {% if age < 18 %} 禁止进入{% endif %}
</div>
<div>{% for foo in age %}​{% endfor %}​
</div>

组件传参

demo.html

 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><title>test</title></head><body><div>{% extends 'component.html' %} {% block content %} 我是传过来的内容 {%endblock %} {% block title %} 我是传过来的标题 {% endblock %}</div></body></html>

component.html

 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><title>这是一个组件</title></head><body>这是一个组件 {% block title %}{% endblock %} {% block content %}{% endblock%}</body></html>

加载图片

 <body><div><img src='{{ url_for("static",filename="image.png") }}' alt="" /></div></body>

加载Css文件

 <head><meta charset="UTF-8" /><title>test</title><link rel="stylesheet" href='{{ url_for("static",filename="demo.css") }}' /></head>

加载Js文件

 <script src='{{ url_for("static",filename="demo.js")}}'></script>

flask 连接 数据库

 pip install pymysql

我们不会直接使用这个包去操作数据库,因为需要写原生的SQL语句,我们最好使用 orm。
所以我们还需要下一个:

 pip install flask-sqlalchemy

sqlalchemy 给我们提供了 orm 的技术,可以让我们像操作普通对象一样去操作数据库。
这个需要额外安装,因为 flask 没有这个依赖。

from flask_sqlalchemy import SQLAlchemy

创建SQLAlchemy实例对象,命名为db,将flask的实例对象app作为参数传给SQLAlchemy,将db和app联系起来,可以调用其相关功能

db = SQLAlchemy(app)

使用gunicorn启动flask

gunicorn app:app -c gunicorn.conf.py > gun.log 2>&1 &

一 Gunicorn是基于unix系统,被广泛应用的高性能的Python WSGI HTTP Server。用来解析HTTP请求的网关服务。
它通常是在进行反向代理(如nginx),或者进行负载均衡(如 AWS ELB)和一个web 应用(比如 Django 或者 Flask)之间。
它的运行模型基于pre-fork worker 模型,即就是支持eventlet,也支持greenlet。

二、gunicorn特点
其特点:1、能和大多数的Python Web框架兼容;
2、简单易上手;
3、轻量级的资源消耗;
4、目前,gunicorn只能运行在Linux环境中,不支持windows平台

gunicorn -w 5 -b 0.0.0.0:6000 main:app

解释下参数含义:

-w :表示工作进程数
-b :访问地址和端口
main :flask启动python文件名
app :脚本中创建的Flask对象名

from flask import Flaskapp = Flask(__name__)@app.route('/',methods=['GET'])
def hello_world():return 'Hello World!'if __name__ == '__main__':app.run(host='0.0.0.0', port=6000)

也可以根据文件启动

gunicorn -c config.py main:app
cat config.py
# 是否开启debug模式
debug = True
# 访问地址
bind = "0.0.0.0:6000"
# 工作进程数
workers = 2
# 工作线程数
threads = 2
# 超时时间
timeout = 600
# 输出日志级别
loglevel = 'debug'
# 存放日志路径
pidfile = "log/gunicorn.pid"
# 存放日志路径
accesslog = "log/access.log"
# 存放日志路径
errorlog = "log/debug.log"
# gunicorn + apscheduler场景下,解决多worker运行定时任务重复执行的问题
preload_app = True
-c CONFIG    : CONFIG,配置文件的路径,通过配置文件启动;生产环境使用;-b ADDRESS   : ADDRESS,ip加端口,绑定运行的主机;-w INT, --workers INT:用于处理工作进程的数量,为正整数,默认为1;-k STRTING, --worker-class STRTING:要使用的工作模式,默认为sync异步,可以下载eventlet和gevent并指定--threads INT:处理请求的工作线程数,使用指定数量的线程运行每个worker。为正整数,默认为1。--worker-connections INT:最大客户端并发数量,默认情况下这个值为1000。--backlog int:未决连接的最大数量,即等待服务的客户的数量。默认2048个,一般不修改;-p FILE, --pid FILE:设置pid文件的文件名,如果不设置将不会创建pid文件--access-logfile FILE   :  要写入的访问日志目录--access-logformat STRING:要写入的访问日志格式--error-logfile FILE, --log-file FILE  :  要写入错误日志的文件目录。--log-level LEVEL   :   错误日志输出等级。--limit-request-line INT   :  HTTP请求头的行数的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。值是0~8190的数字。--limit-request-fields INT   :  限制HTTP请求中请求头字段的数量。此字段用于限制请求头字段的数量以防止DDOS攻击,默认情况下,这个值为100,这个值不能超过32768--limit-request-field-size INT  :  限制HTTP请求中请求头的大小,默认情况下这个值为8190字节。值是一个整数或者0,当该值为0时,表示将对请求头大小不做限制-t INT, --timeout INT:超过这么多秒后工作将被杀掉,并重新启动。一般设定为30秒;--daemon: 是否以守护进程启动,默认false;--chdir: 在加载应用程序之前切换目录;--graceful-timeout INT:默认情况下,这个值为30,在超时(从接收到重启信号开始)之后仍然活着的工作将被强行杀死;一般使用默认;--keep-alive INT:在keep-alive连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间。--reload:默认为False。此设置用于开发,每当应用程序发生更改时,都会导致工作重新启动。--spew:打印服务器执行过的每一条语句,默认False。此选择为原子性的,即要么全部打印,要么全部不打印;--check-config   :显示现在的配置,默认值为False,即显示。-e ENV, --env ENV: 设置环境变量;

这篇关于【星海出品】flask (四) 三方工具使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/388255

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

墨刀原型工具-小白入门篇

墨刀原型工具-小白入门篇 简介 随着互联网的发展和用户体验的重要性越来越受到重视,原型设计逐渐成为了产品设计中的重要环节。墨刀作为一款原型设计工具,以其简洁、易用的特点,受到了很多设计师的喜爱。本文将介绍墨刀原型工具的基本使用方法,以帮助小白快速上手。 第一章:认识墨刀原型工具 1.1 什么是墨刀原型工具 墨刀是一款基于Web的原型设计工具,可以帮助设计师快速创建交互原型,并且可以与团队

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers