做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如何通过解决错误“活动无法转换为片段”将片段传递给类构造函数?   Java中清理Code39条码数据的regex帮助   将java转换为C++   java无法在Android Studio中生成签名的apk,出现错误   从数学方程出发   MySQL和Java内存问题   如何强制Java抛出算术异常?   java为什么JDBC将零端口视为空(默认)端口?   java如何在没有“changelog主题”的情况下加入KStream和KTable   排序我尝试合并两个排序的数组,但得到的是java。lang.ArrayIndexOutofBounds异常:5无法找出原因   如何在java中求大长度矩阵的逆?   基于maven构建的java生成类路径字符串   java每20个字符分割一个字符串,然后将每个部分打印到控制台   将字符串数字字转换为字符串数字:Java   在特定区域使用混合类型的java填充字节数组   尽管java类在开关块中实例化,但它只能调用接口方法