我一直在研究python已经有一段时间了,而且最近我决定开始学习Web开发方面的事情。我有PHP和PHP框架的经验,以及ruby,其中:
如何通过烧瓶和 webapp2 实现这一目标?
我完整阅读了文档和教程,但它让我非常困惑。我只想要一个文件,其中所有路由以及它们应该如何处理都被设置,然后每个路由请求由它自己的模型(python文件)处理。
所有示例都会导致单个文件应用。
非常感谢,真的。请以一种简单的方式亲切地教导。
答案 0 :(得分:5)
Webapp2实际上提供了开箱即用的功能 - WSGIApplication
类实例在Router
属性中提供了router
个实例,可用于集中式网址管理{{3} }。
Flask没有,但实际上这是as shown in the documentation中最基本的形式。使用它定义的LazyView
类,您可以构建一个系统来提供中心URL映射 - 可以是每个模块中的预定义符号,也可以是模块中的特定函数或类实例。
我实际上最近发布了一个包(Patterns for Flask: Lazy Loading),它提供了包装器来简化这种模式的入门。它为此目的提供了两个类HipPocket和LateLoader
。使用HipPocket,您的中央路由配置文件可能看起来像这样(这假设包布局类似于Mapper
):
<强> app.py 强>
from flask import Flask
app = Flask("yourapp")
# ... snip ...
<强> urls.py 强>
from .app import app
from hip_pocket import Mapper
mapper = Mapper(app)
mapper.add_url_rule("/", "index.index")
mapper.add_url_rule("/test", "index.test_endpoint", methods=["POST"])
mapper.add_url_rule("/say-hello/<name>",
"say_hello.greeter",
methods=["GET", "POST"])
<强> index.py 强>
def index():
return "Hello from yourapp.index.index!"
def test_endpoint():
return "Got a post request at yourapp.index.test_endpoint"
<强> say_hello.py 强>
def say_hello(name=None):
name = name if name is not None else "World"
return "Greetings {name}!".format(name=name)
<强> run_app.py 强>
from yourapp.app import app
from yourapp.urls import mapper
# We need to import the mapper to cause the URLs to be mapped.
if __name__ == "__main__":
app.run()
欢迎
答案 1 :(得分:3)
根据我对flask的经验,您无法在中心文件中声明路由配置。路线处理是通过使用路线声明完成的。根据我使用python框架的经验,路由处理是在更细粒度的功能级别而不是文件级别完成的。即使在具有更中心路由配置设置的框架中,路由也被定义为绑定到特定视图/控制器功能而不仅仅是python文件。
如上所述,每个框架都以不同的方式处理它。我详细研究过的三个框架,django,pyramid和flask,都以不同的方式处理它。最接近您要查找的是django,它有一个urls.py文件,您可以将所有url配置放入其中,但同样它指向功能级别项目,而不是更高级别的.py文件。金字塔与主要模块的 __ init __ .py文件中的部分url声明混合使用,并使用装饰器将指定的路径关联到一个功能。然后你有烧瓶,你提到过看了,它似乎只是使用装饰器“简单起见”,因为他们试图减少需要使用或编辑的整体文件和配置文件的数量来从中获取应用程序概念到服务空间。