3rsh1
/single dog/college student/ctfer
3rsh1's Blog

flask框架学习1

初识flask

flask是使用python编写的web微框架。主要有两个依赖,一个是wsgi工具集–werkzeug,另外一个是jinja2模板引擎。
在一个web应用里客户端和服务器上的flask应用的交互可分为以下几步:
1. 用户填写url
2. 服务器端接收到请求包并分析url所请求的资源
3. 为url找到指定的函数
4. 函数执行并且产生响应
5. 回显给客户端

路由

所以我们需要做的就是根据不同的url请求来制定响应函数,而响应函数如果要和指定的url规则绑定则需要添加路由装饰器,并将传入的url规则作为参数。这个过程叫做注册路由,路由负责管理url和函数之间的映射,而这个函数叫做视图函数。

from flask import Flask
app=Flask(__name__) # 实例化flask类,__name__代表当前模块的名称,帮助查找静态文件和模板
@app.route('/') #装饰器
def index():
    return 123

这里的视图函数绑定的url规则是网站的根目录,访问url的时候会执行index()函数,而函数的返回值则作为响应的主题返回,这里的函数可以具有多种功能。一个视图可以绑定多个url规则:

@app.route("/hi")
@app.route("/hello")
def index():
    return "heiheihei"

上述的两个视图函数就绑定了两个url。

当然可以通过路由注册时的一些设置来使得视图函数可以接收url中传输的变量值。

@app.route("/greet/<name>") # 获得name变量的值
def greet(name):
    return "hello %s" % name

这里的name只是一个代称,当你访问url/greet/foo时,foo会作为name变量的值传入视图函数内。当url规则内含有变量,但是请求的url没有含有变量的值时,会返回一个404错误。但是我们可以通过在路由规则内增加默认值来避免此类错误。

@app.route("/greet",defaults={"name":"heihei"})
@app.route("/greet/<name>") # 获得name变量的值
def greet(name):
    return "hello %s" % name

当我们总是想要获取当前视图函数正确的路由规则的时候,可以使用url_for()函数。

url_for(endpoint)

这里的端点值用来标记一个视图函数及其对应的路由规则,断电的默认值为视图函数的名称。

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

例子中的路由的端点就是视图函数的名称index,如下调用url_for("index")可以返回其相对url即\。如果路由规则中又动态的部分,我们需要在url_for()函数内传入相对的参数

命令和环境变量

flask启动命令:

flask run # 会在环境内优先查找app.py和wsgi.py文件
flask run --host=0.0.0.0 #设置监听的主机地址
          --port=5000 #设置监听给定端口,也可以在环境变量里设置

注册flask命令:

@app.cli.command() #装饰器
def hello():
    click.echo("hello man!")

使用方法:

flask hello 
#会在命令行界面输出hello man! 利用的是click模块的echo函数。

如果你的主文件名不是app.py的话,需要设置环境变量FLASK_APP,将自己的模块名称加入到环境变量内。

#linux
export FLASK_APP=hello
#windows
set FLASK_APP=hello

如果安装了python-dotenv,那么在使用flask run或者其他命令的时候会自动在.flaskenv 和 .env文件中加载环境变量,emm这个地方不知道会不会出现环境变量泄露。优先级显然时手设的最大,其次时在.env文件中加载的,最后时在.flaskenv中加载的。.flaskenvz文件主要存储公开的环境变量,.env存储包含敏感信息的环境变量,存储的时候是以键值对的形式。

项目拓展和配置变量

开发环境是本地编写和测试程序时候的计算机环境,而生产环境和开发环境相对指的是部署到服务器上的环境。通过flask_env来设置,参数为development和production。
上下文可以理解为环境,即实例建立之后的一些状态和数据flask shell命令打开的python shell已经包含了当前flask程序的上下文。
大多数拓展都会提供一个拓展类,实例化这个类并且传入程序实例作为参数,即可完成初始化。

from flask import Flask
from flask_foo import foo # 导入拓展类
app=Flask(__name__)
foo=foo(app)    # 创建一个foo拓展实例

关于项目的配置:
如果想要设置程序的一些行为,这时候就需要使用配置变量,这里的配置变量和环境变量不太一样,因为这是规范的程序内部的行为,而上面的环境变量规范的是整个flask程序的行为。这些配置变量通过flask对象的app.config属性作为接口进行统一的接收和设置这里的config类其实也是字典的子类,可以像设置字典一样设置配置变量。

app.config['ADMIN_NAME']='heihei'   #小写的变量名称不会被读取

app.config.update(      # 可以一次设置多个变量
    TESTING=TRUE,
    SECRET_KEY='123'
)

模板与静态文件

这里的网页显然是不可能只单纯的处理值并且返回页面来完成的,还需要更多的装饰。这就涉及到了模板文件和静态文件,我们用它来生成更加丰富的网页。模板是包含程序页面的html文件,静态文件时需要在html文件中加载的css,jsp文件以及字体图片文件等。默认情况下,模板文件存放在项目根目录下的templates文件夹下,静态文件存放在static文件夹下,这两个文件夹需要和包含程序实例的模块处于同一个目录下,对应的项目结构如下:

flask1/
    - templates/
    - static/
    - app.py

很多拓展都提供了对css框架和jsp库的集成功能。使用这些拓展的时候需要加载出对应的css框架和jsp文件,通常这些拓展会提供一些可以在html模板中可以使用的加载方法和函数,如此可以渲染出对应的link标签和script标签。一般会在cdn加载资源。

CDN指分布式服务器系统。服务商把你需要的资源存储在分布于不同地理位置的多个服务器,它会根据用户的地理位置来就近分配服务器提供服务(服务器越近,资源传送就越快)。使用CDN服务可以加快网页资源的加载速度,从而优化用户体验。对于开源的CSS和Java Script库,CDN提供商通常会免费提供服务。

科普一下,用来处理用户数据并且产生响应请求的函数被称为视图函数其实并不准确。flask的用法主要参考了werkzeug,werkzeug中的url匹配实现主要参考了routes(一个url匹配库),routes又参考了ruby on rails。在ruby on rails中术语view用来表示MVC(Mobile-View-Controler)架构中的view。
MVC框架也可用于web程序中,在MVC架构中,程序主要被分为三个组键:数据处理(Mobile),用户界面(View),交互逻辑(Controller)。这里的视图函数似乎更像控制器函数(Controller Function)多一些。

发表评论

textsms
account_circle
email

3rsh1's Blog

flask框架学习1
初识flask flask是使用python编写的web微框架。主要有两个依赖,一个是wsgi工具集--werkzeug,另外一个是jinja2模板引擎。 在一个web应用里客户端和服务器上的flask应用的交互可分为以下…
扫描二维码继续阅读
2020-07-16