flask使用心得

这篇具有很好参考价值的文章主要介绍了flask使用心得。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flask开发

flask不像django那样重量,它非常轻巧,可由程序员自己深度掌控。很适合用来做一些原型快速开发。
一个hello world的例子:

from flask import Flask
import logging

app = Flask(__name__)

@app.route('/')
def hello_world():
    app.logger.info('hello called')
    return 'hello, lee'
    
# 这里指定路径参数类型为int,否则flask默认认为是string
@app.route('/repair_plans/page/<int:page_size>/<int:cur_page>')
def query_data(page_size, cur_page):
    app.logger.info('size:%d, cur_page:%d' % (page_size, cur_page))
    return jsonify(
        pageVO = {'totalRows':1},
        result = [{'bom':'1', 'repairMethod':'维修', 'battleField':'门店', 'isInherited':True, 'repairTech': '打磨', 'repairTechId':101}]
    )

if __name__ == '__main__':
    handler = logging.FileHandler('flask.log')
    handler.setFormatter(logging.Formatter('[%(process)d|%(thread)d][%(asctime)s] [%(levelname)s] %(message)s'))
    app.logger.setLevel(logging.INFO)
    app.logger.addHandler(handler)
    # 这里使用debug模式,可以自动加载修改,非常方便调试
    app.run(debug=True, host='0.0.0.0')   

首先,flask使用注解来绑定url和其处理函数,比django更直观,近似于java web框架的做法了。
其次,flask对日志的使用,就跟普通程序里使用logging一样,不用像django那样受限于框架。

获得incoming request和session

直接访问全局变量request和session即可。

构建response

rv = {'status': script.status, 'msg': msg}
Response(json.dumps(rv), mimetype='application/json')

request

flask里的request看起来是一个全局变量,但其实是threadLocal的,可以放心使用,session变量也是类似的情况。参看该文。

另外,flask的request使用了werkzeug库来包装,它提供了一些成员:

request.form 存放的是界面form表单里的数据;
request.json 存放的是请求体里的数据,相当于spring的@RequestBody注解
request.args 存放的是url路径中的参数,类似于spring的@RequestParam注解。

下载文件

有两种方法:

  1. 将文件放到通过url可访问到的路径
  2. 使用flask.send_from_directory,可从url不能访问到的路径传输文件

注意:send_from_directory会做路径检查,确保没有…这样的可能引发安全问题的路径。

flask底层的文件传输有几种策略:

  1. WSGI server’s file_wrapper support
  2. X-Sendfile头

静态资源服务

flask的send_static_file实际调用的就是send_from_directory(顺带说一下,网上说send_static_file不安全,其实既然send_from_directory是安全的,那send_static_file就也是安全的!)。因此,flask对静态资源的支持跟文件下载是同一原理。

这里有个问题,是让nginx这样的代理服务器代为管理静态资源(nginx在这方面是非常高效的),还是由flask来处理静态资源?

SO上有一段说明:

The preferred method is to use nginx or another web server to serve static files; they'll be able to do it more efficiently than Flask.

我理解,这里面有2点值得注意:

  1. 静态资源的缓存问题,为了效率起见,我们不可能每次都去重新传输一个文件;
  2. 如果有多个flask实例,这些实例间可以共享同一份静态资源,此时可以在多个flask实例前再套一个nginx,由nginx在负载均衡的同时,提供静态资源服务。

flask caching

参考此文。

Blueprint自动添加url前缀

使用Blueprint,可以很方便的为rest请求和静态资源增加url前缀,类似于spring的server.servlet.context-path

先定义蓝图(view.py文件):

main_view = Blueprint('main-view', __name__, static_folder='webapp/')

然后在该蓝图下写路由:

@main_view.route('/')
def home_page():
    gen_session_if_needed()
    return render_template('index.html',
                           example_content='',
                           example_filename='',
                           prerequisite_content='',
                           prerequisite_filename='')

最后注册到flask里面:

from view import main_view

app.register_blueprint(main_view)

注意:蓝图默认不会注册静态资源的路由,需要显示用static_folder来指定。

Blueprint的原理

def route(self, rule, **options):
        """Like :meth:`Flask.route` but for a blueprint.  The endpoint for the
        :func:`url_for` function is prefixed with the name of the blueprint.
        """
        ## f是url的映射函数
        def decorator(f):
            endpoint = options.pop("endpoint", f.__name__)
            ## 缓存映射函数
            self.add_url_rule(rule, endpoint, f, **options)
            return f

        return decorator

def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
        ## 这里记录的是BlueprintSetupState.add_url_rule函数
        self.record(lambda s: s.add_url_rule(rule, endpoint, view_func, **options))    
        
def record(self, func):
        """Registers a function that is called when the blueprint is
        registered on the application.  This function is called with the
        state as argument as returned by the :meth:`make_setup_state`
        method.
        """
        if self._got_registered_once and self.warn_on_modifications:
            from warnings import warn

            warn(
                Warning(
                    "The blueprint was already registered once "
                    "but is getting modified now.  These changes "
                    "will not show up."
                )
            )
        self.deferred_functions.append(func)        
        
def register(self, app, options, first_registration=False):
        """Called by :meth:`Flask.register_blueprint` to register all views
        and callbacks registered on the blueprint with the application. Creates
        a :class:`.BlueprintSetupState` and calls each :meth:`record` callback
        with it.

        :param app: The application this blueprint is being registered with.
        :param options: Keyword arguments forwarded from
            :meth:`~Flask.register_blueprint`.
        :param first_registration: Whether this is the first time this
            blueprint has been registered on the application.
        """
        self._got_registered_once = True
        ## 创建一个BlueprintSetupState
        state = self.make_setup_state(app, options, first_registration)

        ## 处理静态资源 
        if self.has_static_folder:
            state.add_url_rule(
                self.static_url_path + "/<path:filename>",
                view_func=self.send_static_file,
                endpoint="static",
            )
        
        ## 调用前面缓存的url映射函数
        for deferred in self.deferred_functions:
            deferred(state)        
...
...

## BlueprintSetupState.add_url_rule函数,真正添加flask的url路由的地方
def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
        """A helper method to register a rule (and optionally a view function)
        to the application.  The endpoint is automatically prefixed with the
        blueprint's name.
        """
        ##自动为rule添加url_prefix
        if self.url_prefix is not None:
            if rule:
                rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/")))
            else:
                rule = self.url_prefix
        options.setdefault("subdomain", self.subdomain)
        if endpoint is None:
            endpoint = _endpoint_from_view_func(view_func)
        defaults = self.url_defaults
        if "defaults" in options:
            defaults = dict(defaults, **options.pop("defaults"))
        # 然后加到flask app的url路由中,由于该函数肯定是在register blueprint之后调,self.app必然已设置    
        self.app.add_url_rule(
            rule,
            "%s.%s" % (self.blueprint.name, endpoint),
            view_func,
            defaults=defaults,
            **options
        )

总结:蓝图会事先缓存url映射函数,当注册到flask时(通过app.register_blueprint)才真正去添加url路由。

常见问题

结尾有无反斜杠的区别

我们的根url结尾最好加一个斜杠,否则会找不到链接,故障现象是zuul里压根就没有请求的url。因为我们的代码一般是这么写的:

@main_view.route('/')
def home_page():
    gen_session_if_needed()
    return render_template('index.html',
                           example_content='',
                           example_filename='',
                           prerequisite_content='',
                           prerequisite_filename='',
                           url_prefix=SCIMATE_URL_PREFIX)

这就表示根url最后必须要有一个斜杠。

Flask部署

前端都使用nginx做反向代理及负载均衡。

结合gevent

Flask+gevent+gevent.pywsgi:使用gevent自带的WSGIServer

Flask+gevent+uwsgi: uwsgi里有使用gevent的选项

Flask+gevent+gunicorn:gunicorn里有使用gevent的选项

不使用gevent

Flask+uwsgi

Flask+gunicorn

参考文档:

flask启动

如果在代码里写了app.run,就可以直接像普通python程序那样运行。
若没写app.run,启动命令:文章来源地址https://www.toymoban.com/news/detail-664345.html

flask run -h 0.0.0.0 -p 8080

到了这里,关于flask使用心得的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Python + Flask搭建web服务

    示例脚本 运行脚本 在浏览器上校验 在浏览器地址栏输入URL和定义的路径,回车请求,校验响应数据是否正确。 也可使用Python-requests库请求回调测试 运行脚本

    2024年02月14日
    浏览(45)
  • Python Web框架 Flask 安装、使用

    Python Web框架 Flask 安装 安装 Flask 框架 首先需要安装 Flask 框架, 可以通过以下命令安装: 创建 Flask 应用程序 在本地创建一个文件夹,例如叫 myapp ,在该文件夹中创建一个 Python 文件 app.py ,并在其中编写以下代码: 在上面的代码中,我们导入 Flask 框架,并创建了一个名为 ap

    2024年02月17日
    浏览(43)
  • Python-Web框架flask使用

    目录 1.Web框架 1.1 flask 1.1.1 debug调试  1.1.2 定义参数web服务 获取字符串 ​编辑 1.1.3 html网页渲染 1.13.1 带参数传给网页文件 普通元素 列表元素  字典元素 python的web框架,目录结构如下: 1.static存放的是css,js的样式文件 2.templates存放的是html文件 3.app.py是主要接口入口,默认创

    2024年02月16日
    浏览(53)
  • 【python】flask中蓝图使用方法详细解析

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,

    2024年04月23日
    浏览(51)
  • 【让AI女友跟我表白】大白话说Python+Flask入门(四)Flask Sijax的使用

    先吐槽两句,搞个 mysql 安装配置弄了4个小时,怎么都是外网无法访问,我靠,我特么也是服了。 当然,后来我投降了,明天再说,学什么不是学,娘的, 换个方向,状态依然在! 代表 Simple Ajax ,它是一个 Python / jQuery 库,使用 jQuery.ajax 来进行AJAX请求用的。 pip install flas

    2024年02月05日
    浏览(51)
  • python使用Apache+mod_wsgi部署Flask

    安装时勾选\\\"Add python.exe to PATH\\\"就不需要手动配置环境变量了: 直接下一步即可: 选择自己的安装目录: 安装完成后验证是否安装配置成功,打开cmd,输入如下命令: 如下则表示配置成功: 下载地址 注意要和Python版本一样,Python 3.10选择cp310,这里我选择的是 mod_wsgi-4.9.2-c

    2024年01月18日
    浏览(42)
  • 使用IIS服务器部署Flask python Web项目

    参考文章 参考文章 将Flask应用程序部署到IIS服务器上需要一些步骤,因为IIS是为.NET应用程序设计的。要将Flask Python Web项目部署到IIS服务器,您需要使用一个称为\\\"FastCGI\\\"的桥接工具来连接IIS和Python应用程序。以下是将Flask应用程序部署到IIS服务器的一般步骤: 安装IIS和FastCG

    2024年04月16日
    浏览(52)
  • Python Flask Web开发二:数据库创建和使用

    数据库在 Web 开发中起着至关重要的作用。它不仅提供了数据的持久化存储和管理功能,还支持数据的关联和连接,保证数据的一致性和安全性。通过合理地设计和使用数据库,开发人员可以构建强大、可靠的 Web 应用程序,满足用户的需求。这里介绍:SQLAlchemy 安装pymysql和

    2024年02月10日
    浏览(59)
  • Python 2.x 中如何使用flask模块进行Web开发

    Python 2.x 中如何使用 Flask 模块进行 Web 开发 引言: 随着互联网的快速发展,Web开发成为了互联网行业中一项非常重要的技术。而在 Python 的Web开发中,Flask框架是一种非常流行的选择。它简单轻巧,灵活易用,适合中小型项目的快速开发。本文将介绍如何在 Python 2.x 版本中使用

    2024年02月14日
    浏览(44)
  • 使用Dockerfile构建python项目镜像(flask框架+redis+环境变量)

    有时候如连接redis的url可能发生变化等,这时候就需要把一些变量放在环境变量中。         使用 --env 和 -e 是一样效果的。 1.1.1 配置Dockerfile文件 1.1.2 编写python示例程序 示例代码: 1.1.3 构建镜像         首先将python代码和dockerfile文件上传到已经安装了docker的服务器

    2024年02月07日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包