Flask应用程序在部署时如何实际运行?

时间:2016-08-27 22:05:55

标签: python flask

我想了解一些有关如何在部署Flask应用程序时执行代码的信息(例如,使用gunicorn)。

例如,假设我在foo = [2, 9, 3, 23, 45, 9] foo.sort() @app.route('/') def index(): return render_template('base.html', foo=foo) 中有以下内容:

foo

before_first_request什么时候排序?服务器启动时只有一次?每次有请求?别的什么?

documentationbefore_requestmodel { for ( s in 1:nSubj ) { nCorrOfSubj[s] ~ dbin( theta[s] , nTrlOfSubj[s] ) theta[s] ~ dbeta( aBeta[CondOfSubj[s]] , bBeta[CondOfSubj[s]] ) } for ( j in 1:nCond ) { # Use omega[j] for model index 1, omega0 for model index 2: aBeta[j] <- ( equals(mdlIdx,1)*omega[j] + equals(mdlIdx,2)*omega0 ) * (kappa[j]-2)+1 bBeta[j] <- ( 1 - ( equals(mdlIdx,1)*omega[j] + equals(mdlIdx,2)*omega0 ) ) * (kappa[j]-2)+1 omega[j] ~ dbeta( a[j,mdlIdx] , b[j,mdlIdx] ) } omega0 ~ dbeta( a0[mdlIdx] , b0[mdlIdx] ) for ( j in 1:nCond ) { kappa[j] <- kappaMinusTwo[j] + 2 kappaMinusTwo[j] ~ dgamma( 2.618 , 0.0809 ) # mode 20 , sd 20 } # Constants for prior and pseudoprior: aP <- 1 bP <- 1 # a0[model] and b0[model] a0[1] <- .48*500 # pseudo b0[1] <- (1-.48)*500 # pseudo a0[2] <- aP # true b0[2] <- bP # true # a[condition,model] and b[condition,model] a[1,1] <- aP # true a[2,1] <- aP # true a[3,1] <- aP # true a[4,1] <- aP # true b[1,1] <- bP # true b[2,1] <- bP # true b[3,1] <- bP # true b[4,1] <- bP # true a[1,2] <- .40*125 # pseudo a[2,2] <- .50*125 # pseudo a[3,2] <- .51*125 # pseudo b[1,2] <- (1-.40)*125 # pseudo b[2,2] <- (1-.50)*125 # pseudo b[3,2] <- (1-.51)*125 # pseudo b[4,2] <- (1-.52)*125 # pseudo # Prior on model index: mdlIdx ~ dcat( modelProb[] ) modelProb[1] <- .5 modelProb[2] <- .5 } 的存在似乎提供了线索,但在我理解代码的准确性之前,我无法理解它们要解决的问题在服务器上运行。

你能逐步解释(例如,先发生A,然后发生B,然后是C)或指向在线资源吗?

1 个答案:

答案 0 :(得分:2)

你问的问题 - 关于什么时候发生的事情 - 与Flask上游发生的事件有关......就像当gunicorn启动时一样。

Flask是Web Server Gateway Interface (WSGI) application framework。 WSGI是一个特定于Python的框架,用于定义Web服务器与应用程序的接口方式。 (Java等价物是Java servlet。) 服务器将使用Python的WSGI协议在适当时调用Flask。 deploying a standalone WSGI application上的Flask文档展示了如何手动设置它,并让您对Flask上游的内容有所了解。 关于Gevent的部分非常有用,因为它明确显示了yourapplication的import语句及其与HTTP服务器的关系:

from gevent.wsgi import WSGIServer
from yourapplication import app  # if yourapplication imports from views,
                                 # the sort would happen once; here.

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

source code for gunicorn显示了类似的方法,每个worker加载一次WSGI应用程序,然后无限期地运行。

... Flask的应用程序上下文

但您可能正在寻找一种方法来创建一些新变量或实例化一个新的数据库连接或建立一个唯一的会话cookie - 每次处理一个请求时应该发生的事情,而不是只在应用程序代码是加载。为此,您应该查看Flask的application context。从引用的页面:

  

根据需要创建和销毁应用程序上下文。它永远不会移动   线程之间不会在请求之间共享。就是这样   存储数据库连接信息和其他东西的理想场所。