53

【Django 教程1】Web框架

 5 years ago
source link: http://midday.me/article/103be239957f445d81ab4224e014ade8?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【Django 教程1】Web框架

Web框架

Django 是一个Web开发框架,在仔细研究Django之前,先理解下Web框架的作用。 如果没有框架,可以用Python提供的库完成一个简单的网站,在页面上显示"Hello World"。运行 下面的代码,然后在浏览器输入:http://localhost:8888/ 就能看到页面上会显示"Hello World". 这是一个HTTP Server, 把我们想要的内容传到了客户端,如果要理解这过程是怎么完成的需要网络和网络协议相关知识。

import http.server
PORT = 8888

class MyHandler(http.server.SimpleHTTPRequestHandler):

    def do_GET(self):
        self.send_response(http.server.HTTPStatus.OK)
        # can read content from file or database
        content = b"Hello World"
        self.send_header("Content-type", "text/html; charset=%s" % "utf-8")
        self.send_header("Content-Length", str(len(content)))
        self.end_headers()
        self.wfile.write(content)


def run(server_class=http.server.HTTPServer, handler_class=MyHandler):
    server_address = ('', PORT)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()


if __name__ == '__main__':
    print('start server')
    run()

在上面的例子里,显示的数据content 是硬编码到代码里的,如果数据存在文件 /tmp/test.html 里面我们可以把第9行改成:

content = open('/tmp/test.html','rb').read()

最开始的网站就是这样的,所有数据存在文件里。

如果要根据用户的输入显示不同的内容又该怎么实现呢? 如果用户想修改服务端的数据又该如何? 不同用户登录一个网站会看到不同的内容又该如何实现呢? 我们怎么知道用户是否已经登陆了呢?

上面这些问题,都可以我们自己写代码完成,但这些问题的处理过程都有很多相似支出,而且在不同的地方是通用的,所以我们可以进行抽象。比如上面的 do_GET 方法,我们不确定的只是content的的内容是读数据库还是读文件,但其他的都是一样的,是不是可以提供个接口就好,其他的内容不要每次都写,比如这样

import http.server
PORT = 8888

class MyHandler(http.server.SimpleHTTPRequestHandler):

    def do_GET(self):
        self.send_response(http.server.HTTPStatus.OK)
        # can read content from file or database
        content = self.get_content()
        self.send_header("Content-type", "text/html; charset=%s" % "utf-8")
        self.send_header("Content-Length", str(len(content)))
        self.end_headers()
        self.wfile.write(content)

    def get_content(self):
        return b"Hello World"


def run(server_class=http.server.HTTPServer, handler_class=MyHandler):
    server_address = ('', PORT)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()


if __name__ == '__main__':
    print('start server')

如果要从数据库里读,只需要继承MyHandler 然后重写 get_content ,类似这样的事情,就是Web框架做的,让代码可重用,让工程师更专注的解决业务问题。

如果有Web框架,该如何实现上面的Hello World呢?先用Flask来做例子吧,相对简单。首先安装Flask

pip install Flask

实现如下:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(port=8888)

这看起来简单,清爽很多。

Django 简介

为了了解更多Web框架的知识,我想Django是一个比较好的对象,主要有下面几个原因。 Django 是 Python Web开发框架中比较重的一个,而且是一个传统的MVC框架,导致Django不太那么流行,特别是大型的Web应用。但Django封装了很多模块,涉及到Web开发的方方面面,所以如能比较透彻的理解Django 做了哪些封装,为什么要做,如何做到的对全面理解Web开发是有好处的,而且Django对于开发简单的小型应用很有效率。Flask在某种程度上和Django很像,了解Django对了解其他框架,甚至对其他语言的框架也有帮助。另外Django 有比较完善的文档,活跃的社区,官网显示Django社区有来自 162个国家的一万多人。阅读这些文章,需要有Python 的基础知识,有一定的Web知识,知道HTML,CSS,HTTP等等。

ENzeqi6.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK