如何基于Python制作类似Django的web框架?
我只是想知道,制作一个像Django这样的网页框架需要什么知识或技术。
这个网页框架应该能够作为云计算使用(也就是说,当需要的时候,可以通过把一些需要处理的任务发送到其他服务器来扩展网站的能力),同时如果开发者想要快速搭建一个简单的网站,它也能像Django那样高效。
抱歉,我的英语很生疏,因为我来自韩国。
请给我一些建议或者指导,告诉我制作网页框架需要哪些技术,或者我应该做什么、学什么。
非常感谢!
4 个回答
一个网页应用框架应该处理HTTP请求,并提供一些工具,比如说,帮助简化计算响应的过程。
你还可以看看其他的Python网页框架,比如Bottle(一个微型框架)和Web2py(基于MVC架构模式)。Bottle API的文档很有指导性。
你在这里问了几个问题:
如何制作一个像Django这样的网络框架
首先,看看这篇文章,如何在网络上使用Python。它提供了关于框架各个组成部分的很好的想法。
接下来,你需要问问自己,你想自己做多少事情。
从零开始
如果你是为了学习框架的各种细节而做这个,你应该了解一下WSGI。WSGI是Django(以及大多数其他Python框架)用来和实际处理请求的网络服务器(比如Apache、nginx和lighthttpd)进行交互的接口。它不一定是一个库(虽然有一些库可以帮助创建WSGI应用),更像是一个标准接口,使用它可以保证你的代码能和其他服务器兼容。
它的样子是这样的:
def application(environ, start_response):
# your implementation here
就是这样。environ
是一个字典,里面包含了所有的CGI环境变量。start_response
是一个回调函数,你用它来传递响应头和状态码。最后,这个函数需要返回一个迭代器,也就是响应的主体。你可以在WSGI网站上找到更多相关信息。
使用“包装”库
如果你不想处理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,但还有其他的库可以看看。比如,werkzeug和WebOb。
使用现有框架(推荐)
不过,如果你的目标只是创建一个网站,而你觉得Django不能满足你的需求(这可能并不是真的,但我偏题了),那么你就不需要自己制作框架。市面上有很多比Django更轻量的框架,它们允许你更自由地选择自己想用的库(“模块化”)。这意味着它们的设计考虑到你可能会出于任何目的使用,而不是像Django那样,试图引导你使用他们的所有工具。可以看看像Flask、Bottle和CherryPy这样的框架。
要明白,所有这些框架、库和API只是实现目标的手段。你想做的任何事情都可以在它们中实现,所以关键是找到一个能提供合适内置工具的框架,这样你就不需要自己去实现那些底层代码,同时又不会被太多高层的东西干扰。
让网络框架可以在云端提供服务,以便进行横向扩展
这其实并不是网络框架本身的要求。即使以典型的方式使用Django(使用他们的ORM和SQL数据库),也可以在一定程度上实现横向扩展(可以查看Django书籍的部署章节,了解如何做到这一点;那里表达的想法实际上可以用于大多数横向扩展的网络应用)。合理的横向扩展性是通过编写应用程序的方式来实现的,这样可以让它横向扩展。通常,这意味着编写服务器代码时要假设它可能会在不同的物理服务器上处理请求。例如,如果你把cookie数据存储在网络服务器的一个平面文件中,可能会出现问题,因为下一个请求可能会去另一个服务器,因此找不到那个cookie数据。那数据需要存储在所有服务器都可以访问的数据库中。
所以,希望这些信息足够让你明白,要创建一个可以扩展的框架,你只需要理解扩展的概念,并以不会影响你网站扩展能力的方式构建或使用你想要的框架。然后,扩展的责任就交给框架的用户了。
你也可以选择另一种方式,让框架强制用户使用它自己的API来处理所有事情,并以你知道在某些情况下会扩展的方式编写这些API。然后,让用户在这种特定情况下设置网站。这类似于Google App Engine的工作方式。虽然这是个不错的主意,但这确实限制了用户只能使用Google允许的东西。