我有一个Ring应用程序,可以通过from flask import Flask, Blueprint
from flask_restplus import Api, Resource
app = Flask('__name__')
blueprint = Blueprint('v1', __name__, url_prefix='/rest/v1')
api = Api(blueprint, doc='/apidoc/', version='1.0')
@blueprint.route('/', endpoint='rootres')
def root():
return ''
ns = api.namespace('test', description='desc')
@ns.route('/', endpoint='rootresource')
class RootResource(Resource)
def get(self):
...
app.register_blueprint(blueprint)
部署到生产中; myservice.war。在生产中,WAR文件被抛入Jetty,它在名称
uberwar
当我通过lein ring在本地运行时,我需要它在相同的上下文中运行;为MyService。
$ curl -i -X GET http://myservice.qa1.example.com:8080/myservice/healthz
HTTP/1.1 200 OK
...
但同样的卷曲在我当地发生了所有404。
$lein ring server-headless
2015-10-14 14:04:03,457 level=INFO [main] Server:271 - jetty-7.6.13.v20130916
2015-10-14 14:04:03,482 level=INFO [main] AbstractConnector:338 - Started SelectChannelConnector@0.0.0.0:10313
Started server on port 10313
lein ring将它部署到根上下文中。
$ curl -i -X GET http://localhost:10313/myservice/healthz
HTTP/1.1 404 Not Found
...
那是什么?如何指示lein ring部署到我选择的上下文名称中?我需要$ curl -i -X GET http://localhost:10313/healthz
HTTP/1.1 200 OK
...
从lein ring工作
答案 0 :(得分:1)
解决此问题的一种方法是为您的应用创建第二组(独立)路由。您还为独立案例创建第二个处理程序。然后,您可以使用Leiningen配置文件为独立案例和超级战争案例指定不同的处理程序。运行独立应用程序时使用默认配置文件。创建uberwar时使用:uberjar
配置文件。因此,当战争部署到容器中时,将使用与lein ring server-headless
一起使用的独立处理程序和常规处理程序。
创建第二组路由所需的额外代码不多。您可以在您选择的上下文中包装现有路线。假设以下是您的路由和环处理程序:
(defroutes app-routes
(GET "/healthz" [] "Hello World")
(route/not-found "Not Found"))
(def app
(wrap-defaults app-routes site-defaults))
独立案例的附加路由和处理程序如下所示:
(defroutes standalone-routes
(context "/myservice" req app-routes)
(route/not-found "Not Found"))
(def standalone-app
(wrap-defaults standalone-routes site-defaults))
现在,转到lein-ring
中的project.clj
配置。我们希望默认的环处理程序指向standalone-app
。 uberwar的环处理程序应指向app
。 :ring
中项目地图中的project.clj
条目应如下所示(根据您的实际命名空间进行调整):
:ring {:handler myservice.handler/standalone-app}
此外,将以下内容合并到:profiles
中的project.clj
地图:
:uberjar {:ring {:handler myservice.handler/app}}
请务必使用最新版本的lein-ring
插件。版本0.9.7对我有用。早期版本(如0.8.3)无法正常运行,因为它们在运行:uberjar
任务时未使用uberwar
配置文件。
如果你做了这一切,并假设你的war文件名为myservice.war,那么无论你的应用程序是以lein ring server-headless
启动还是部署了war文件,URI的上下文部分都将是相同的在码头。
$ curl http://localhost:[port]/myservice/healthz