77.Flask基础知识

转载请注明原始链接:https://blog.csdn.net/a464057216/article/details/83098125

后续此博客不再更新,欢迎大家搜索关注微信公众号“测开之美”,测试开发工程师技术修炼小站,持续学习持续进步。
在这里插入图片描述

简介

Flask是Python的一个轻量微框架。微框架中的“微”,意味着Flask核心简单,但这并不意味着Flask功能薄弱,相反,Flask有许多插件支持连接数据库、表单验证、文件上传等各种功能,配合这些插件可以实现非常强大的功能。Flask是Python在Web开发领域的一件利器。

安装

Flask支持Python>=3.4、Python 2.7或PyPy,安装命令:

pip install Flask

自动安装如下依赖:

  • Werkzeug:Python的一种WSGI实现。
  • Jinja:一种模板渲染语言。
  • MarkupSafe:配合Jinja,转义客户端的输入,规避跨站脚本攻击(Cross Site Script,CSS)。
  • ItsDangerous:利用数字签名技术保证数据一致性,用来保护Flask的session加密。
  • Click:编写命令行程序的框架,Flask用它支持flask命令并允许添加自定义命令。

如下依赖不会自动安装,如果环境上存在的话,Flask会自动加载使用:

  • Blinker:支持信号量(Signal)。
  • SimpleJSON:兼容Python的json模块,速度更快。
  • python-dotenv:运行flask命令时,提供从dotenv提取环境变量的支持。
  • Watchdog:开发模式下,提供更快、更高效的装载器。

小试牛刀

# hello.py,应用程序文件名不能是flask.py,这会和Flask本身冲突
from flask import Flask #一个Flask类的实例表示一个Web应用程序
app = Flask(__name__) #第一个参数是应用程序的模块或包名,Flask根据此参数查找模板、静态文件等内容

@app.route('/') #route()装饰器,定义URL和视图函数的绑定关系
def hello_world():
    return "Hello, World!"

启动应用程序可以使用flask命令:

$ export FLASK_APP=hello.py
$ flask run

也可以使用Python的-m开关:

$ export FLASK_APP=hello.py
$ python -m flask run

Flask会启动一个非常简单的内置服务器( 仅供调试,不建议用于生产环境),浏览器访问http://127.0.0.1:5000即可看到Hello, World的响应:
在这里插入图片描述
默认情况下,Flask应用程序只监听本机loopback网络,flask run --host=0.0.0.0可以令程序监听所有网络端口。一定要确保关闭了调试功能,再开放监听所有网络端口。

开发模式与调试功能

Flask的开发模式,在程序出错时提供调试功能,并且自动装载最新的代码,不必每次更新代码都重启应用程序。flask run之前通过如下方式开启开发模式:

export FLASK_ENV=development

开发模式的Flask开启了如下功能:

  1. 开启调试器
  2. 开启自动装载器
  3. 在Flask应用程序上应用调试器

如果想只在Flask应用程序上应用调试器,使用如下命令:

export FLASK_DEBUG=1

生产环境无论如何都不要开启开发模式,开发模式下允许应用程序的用户在服务器上执行任意的Python代码。比如如下异常场景:
在这里插入图片描述
鼠标悬浮在报错的那一层上,点击最后侧的命令行图标,即可基于该层进行调试:
在这里插入图片描述

路由

Flask通过route()装饰器绑定URL和视图函数,例如:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'

URL的可变部分用<variable_name>代替,<variable_name>的值作为关键字参数传递给绑定的函数,也可以使用<converter:variable_name>指定变量的类型。

from flask import Flask
from markupsafe import escape
app = Flask(__name__)

@app.route('/user/<username>')
def show_user_profile(username):
    return 'User %s' % escape(username)

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return 'Post %d' % post_id

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    return 'Subpath %s' % escape(subpath)

converter支持如下类型:

  • string:除斜线(/)外任何字符串。
  • int:十进制正整数。
  • float:正浮点数。
  • path:类似string类型,但是接受斜线(/)。
  • uuid:接受uuid字符串。
    对于特殊字符(如#),在浏览器中输入时需要URL转码后访问(如%23)。

URL唯一性与URL重定向

有如下两种格式定义的URL:

rom flask import Flask
app = Flask(__name__)

@app.route('/projects/')
def projects():
    return 'The project page'

@app.route('/about')
def about():
    return 'The about page'

访问http://127.0.0.1:5000/projects,Flask会将请求重定向到http://127.0.0.1:5000/projects/。访问http://127.0.0.1:5000/about/,Flask响应404 Not Found。建议使用不带后缀斜线的URL,为资源确定唯一的URL,防止搜索引擎为同样的页面建立两次索引。

生成URL

使用url_for()函数生成某个方法的URL,url_for()的第一个参数是方法名(字符串),然后是关键字参数,这些关键字参数相当于URL的可变部分<variable_name>,如果提供的关键字参数不存在,作为查询参数生成URL(?key=value)。

不将URL硬编码到模板文件中的理由:

  1. 生成URL比硬编码更具可读性。
  2. 修改URL格式时,只需修改route()装饰器定义处,无需修改所有使用了此URL的地方。
  3. 生成URL自动处理字符转义、Unicode编码转换等场景。
  4. 生成URL得到的是绝对路径,避免了浏览器中使用相对路径可能出现的问题。
  5. 如果应用程序不在URL根目录下,比如在/myapplication目录而不是/目录,url_for()也能正确处理。
from flask import Flask
from flask import url_for
from markupsafe import escape

app = Flask(__name__)

@app.route('/')
def index():
    return 'index'

@app.route('/login')
def login()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值