做web应用的一个小框架

steinie的Python项目详细描述


用法

斯坦尼是围绕路线的概念而建立的。你的申请表是由 通过代码引导Web请求的一个或多个路由。我们开始吧 使用最简单的hello world web应用程序。

fromsteinieimportSteinieapp=Steinie()@app.get("/")defget(request,response):return"Hello World, from Steinie!\n"if__name__=="__main__":app.run()

如果将其保存到文件中,则可以使用 python 直接运行此命令。这个 在端口5151上启动一个简单的开发服务器,响应 / 在本地计算机上路由。试试看。

Steinie使用Werkzeug来处理其路线。这意味着你所有的 您可以在Steinie内部找到熟悉的路线模式。

steinie为 get post 以及 delete 提供了内置的decorators, 信息 选项 补丁 输入 ,以及 跟踪

处理参数

另一个常见的需求是为web应用程序提供参数。让我们说 您想在您的路径中添加一个 用户名,但您希望它大写 (请稍等我一下),您可以使用 param decorator这样做 这:

fromsteinieimportSteinieapp=Steinie()@app.param("username")defcapitalize(param):returnparam.capitalize()@app.get("/<username:some_user>")defhandler(request,response):return"Hello, %s\n"%request.params["some_user"]if__name__=="__main__":app.run()

使用 param decorator指定所需参数的名称 若要创建,则提供一个指定要执行的操作的函数。你可以 运行此示例,然后加载http://localhost:5151/alice ,它将响应 用"你好,爱丽丝!"

"

如果你熟悉烧瓶的转换器(也可以说是Werkzeug的)。 可能看起来很眼熟。再一次,在Werkzeug基地的基础上 这里提供的内容模拟了您可能已经习惯的内容。

既然您已经看到了基本的示例,那么想象一下如果您创建了 从数据库加载用户对象并返回该对象的函数。使用 在 params decorator中,您可以开始从 将请求传入到与您实际建模方式相匹配的内容中 应用程序。

分组路由和参数

你可能想知道这是怎么衡量的。一个有很多装饰的文件 对我来说,函数听起来相当笨拙。谢天谢地,斯坦尼提供了一种方法 通过它所称的 路由器

让我们加强上面的例子。大部分与用户有关,所以 我们将创建一个新的 路由,然后将其安装到 /user

首先,调整import语句,使其看起来像这样:

fromsteinieimportSteinie,Router

接下来,从 路由器创建一个新的 route 对象,并调整两个 用它来修饰函数。应该是这样的:

route=Router()@route.param("username")defcapitalize(param):returnparam.capitalize()@route.get("/<username:some_user>")defhandler(request,response):return"Hello, %s\n"%request.params["some_user"]

最后,您需要修改您的 应用程序 对象以使用您的新路由。 您可以使用这样的方法来完成这项工作:

app.use("/user",route)

保存工作,启动代码,然后再次访问服务器。如果你尝试 再次转到http://localhost:5151/alice 将得到404。相反,你 需要将 /user 添加到URL中,以便如下所示: http://localhost:5151/user/alice

处理中间件

成为steine专家还有一个部分:中间件。中间件 使您有机会修改每个传入请求的请求或响应。

让我们继续以上面的例子为基础。而不是使用 参数 decorator,让我们创建一个中间件,它将所有的 都大写 参数。

首先,让我们创建中间件。斯坦尼希望它们是可以 被初始化并提供一个 路由器 实例,然后通过 方法。就这样。将此添加到您的文件a然后你可以说 您已经创建了自己的Steinie中间件:

classCapitalizeMiddleware(object):def__init__(self,route):passdef__call__(self,request,response,_next):if"some_user"inrequest.params:new=request.params["some_user"].capitalize()request.params["some_user"]=newreturn_next(request,response)

这里有几件事要说。首先,我们不需要 路径 在实例化时提供,因此不需要存储它。如果你做了,你 可以将其设置为类的属性。

接下来,方法有三个参数。 请求 以前的响应 很熟悉,但是 \u next 是新的。这是一个 由steinie生成的函数,它允许中间件控制发生的事情 当它被调用时。在这里,我们想修改 一些用户 当它存在时将其大写,然后继续。为了这个,你 只需返回 \u next(请求,响应) 的结果

控制这里发生的事情的能力是steinie中间件的一个关键部分。 您可以从 _next 捕获返回值并对其进行处理。使用 我突然想到的案例是一个试图加载 一个来自缓存的请求,如果找到它,则返回该请求,但将允许该请求 如果还没有缓存,则进行检查。

这个简单的例子就是,非常简单。

您还没有完全完成中间件。接下来你要告诉你 路由器使用它。输入路由器。再次使用

route.use(CapitalizeMiddleware)

这与将路由器附加到应用程序的方法相同,但是 这次没有与之关联的路由(上面使用的第一个参数) 它。提供 路由器。用一个参数信号给steinie 你给它一个中间件,它应该在处理所有 请求此路由器尝试处理。

您应该做的最后一个修改是删除params函数 调整你的路线。完成后,应该是这样:

@route.get("/<some_user>")defhandler(request,response):return"Hello, %s\n"%request.params["some_user"]

现在,重新运行代码并访问它。你应该得到相同的输出,但是 是另一种模式。是什么让一种模式比另一种更好?有趣的 你应该提一下,这是下一个话题。

中间件与参数

中间件和参数都可以用来实现非常相似的目标,但是 他们有不同的角色。

< DL>
中间件
这些是全局的,有机会修改每个传入的请求。他们 有充分的要求,并有能力规避正常的反应。 当需要修改针对给定对象处理的每个请求时,请使用它们 路由或您需要做的不仅仅是将请求url的一部分更改为其他 对象.< /dD>
参数
这些被本地化为在请求url中具有参数的路由。 与中间件不同,它们所能做的只是将url的一部分转换为 否则。它们在将id转换为数据库中的对象时非常有用 或者其他类似的转变,但他们不会让你改变 斯坦尼回来的回应。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java连接usb到uart设备到安卓设备>3.1   可以强制Php中的web应用程序与Java中的桌面应用程序一起工作吗?   java为什么自定义系统类加载器不工作?   数组在Java中解析具有多个分隔符的字符串   PMD Java 8德米特定律   JavaSpringMVC表单验证不适用于嵌套的复杂类型   让Eclipse Java组织导入以使用Google checkstyle   java Appium:无法创建新会话   java如何在数组中声明新字段   java如何解决“无法初始化类org.apache.cassandra.config.DatabaseDescriptor”?   java AsyncTask创建socket   java向@CreatedBy添加更多信息   如何在ubuntu中运行包含大量jars依赖项的java文件   java如何使用<s:select>标记并在中休眠来填充下拉列表?   java获取错误:找不到符号变量“level”和“next_level_button”   javaweb应用中基于UI的ajax显示代码流   Java长到MySql   java JvisualVM:奇怪的应用程序行为   ubuntu将Java程序的输出结果保存到一个文件中