如何基于Python制作像Django一样的Web框架?

14

我想知道制作一个像Django这样的Web框架需要哪些知识或技术。

所以当需要时,该Web框架可以作为云计算(通过将必须解决的一些问题发送到其他服务器来水平扩展网站),并且如果开发人员想要快速构建一个简单的网站,它也可以像Django那样使用。

抱歉,我的英语很尴尬,因为我是韩国人。

请给我一些方法或指令,告诉我构建Web框架需要什么技术,我需要做什么或者学什么。

非常感谢。

4个回答

46

你在这里提出了几个问题:

如何制作像Django一样的Web框架

首先,查看这篇文章如何在Web上使用Python。它提供了关于构建框架所需的各种要素的非常好的想法。

接下来,你需要问自己有多少是想要自己创建。

从头开始

如果你正在做这个练习来学习框架的内部结构,那么你应该阅读WSGI。WSGI是Django(以及大多数其他Python框架)用于与实际处理请求的Web服务器(如Apache、nginx和lighthttpd)进行接口交互的API。它不一定是一个库(尽管有助于创建WSGI应用程序的库),但更像是一个标准的API,当使用时,承诺你的代码将与其他服务器一起工作。

它看起来像这样:

def application(environ, start_response):
    # your implementation here

就是这样。 environ 是包含所有 CGI 环境变量的字典。 start_response 是一个回调函数,你需要用响应头和状态码来调用它。最后,函数需要返回一个迭代器,即响应体。你可以在 WSGI 网站 上了解更多信息。

使用“Wrapper”库

如果你不想处理 WSGI 的细节(它确实有一些可能会引起麻烦的缺陷),那么有几个不同的库可以将 WSGI 接口封装成稍微更加用户友好的形式。例如,不再将响应头作为字符串元组列表:

response_headers = [('Content-Type', 'text/plain'),
  ('Content-Length', str(len(response_body)))]

...他们可能允许您拥有一个响应对象,通过字典设置标头...

response.headers['Content-Type'] = 'text/plain'
response.headers['Content-Length'] = len(response_body))

Django有自己的请求和响应API,但也有其他可供选择的选项。我能想到的有werkzeugWebOb

使用现有框架(推荐)

然而,如果你的目标只是创建一个网站,并认为Django不能完成你想要的(这可能不是真的,但我偏离了主题),那么你根本不需要创建自己的框架。有很多比Django更轻量级的框架可供选择,并且允许你更自由地选择自己的库来使用(“模块化”)。这意味着它们的设计理念是你可以用它们来实现任何目的,而不像Django这样的框架,试图引导你使用他们所有的工具。请查看FlaskBottleCherryPy等框架。

请见下方翻译:

要意识到所有这些框架、库和API只是达到目的的手段。你想做的事情可能在任何一个框架中都可以完成,所以关键是找到一个给你合适的内置工具组合的框架,它可以处理所有你不必实现的低级代码,而不会在高级别方面妨碍你。

允许Web框架在云中提供服务,以便进行水平扩展

这并不是Web框架本身的要求。即使是使用Django的典型方式(使用他们的ORM和SQL数据库),也可以在很大程度上进行水平扩展(请参阅Django Book的部署章节中的“Scaling”部分,了解如何完成此操作;其中表达的思想实际上可以用于大多数水平扩展的Web应用程序)。通过编写可进行水平扩展的应用程序,可以实现合理的水平扩展性。这通常意味着以一种假设服务器代码可能在不同物理服务器上处理请求的方式编写服务器代码。因此,例如,如果您将cookie数据存储在Web服务器上的平面文件中,可能会遇到问题,因为下一个请求可能会发送到另一个服务器,因此不会找到该cookie数据。这些数据需要存储在所有服务器都可以访问的数据库中。

因此,希望以上内容足以让您知道,要创建一个可扩展的框架,你只需要了解扩展,并以不会影响网站扩展能力的方式构建或使用所需的框架。然后,由框架的用户来扩展它。

你可以选择另一种方向,强制用户使用框架提供的API,并以某种方式编写API,确保在特定情况下能够扩展。然后,让用户在该特定情况下设置网站。这类似于谷歌应用引擎的工作方式。虽然是个好主意,但这会限制用户只能使用谷歌允许的内容。

哇..太棒了!! 你真是个天才!! 你怎么知道这些的?哇!! - Anderson
2
继续做事情,你就会不断学习新的东西 :) - Mark Hildreth
1
很棒的答案。我只想补充一下,webob文档中有一篇关于这个主题值得阅读的文章。http://docs.webob.org/en/latest/do-it-yourself.html - Tom Willis

4

一种现代的Python Web框架应该实现WSGI。您可以从PEP 333了解其背后的原理以及一些好的示例。

这里有另一个教程,它可以帮助您完成创建整个Web框架的过程。


非常感谢!!!WSGI.. 嗯~~ 谢谢~ 真的很有帮助~ - Anderson

1
一个Web应用程序框架应该处理http请求并提供实用工具,例如简化计算响应。
您还应该查看其他Python Web框架,例如bottle(微框架)和Web2py(基于MVC架构模式)。 Bottle API是教学性的。

1
我也会浏览一下Paste文档,从Ian Bicking的博客中阅读一些内容。他非常清晰地阐述了概念性的模块,并在其开发时发布了所学到的教训。
当然,Web2py文档也是可以参考的。
但正如UKU所说:WSGI是现代的要求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接