本节内容

 

Http原理介绍

自行开发一个Web框架

WSGI介绍

Django介绍

MVC/MTV

Django安装

创建项目与APP

开发第一个页面

 

为什么学Django?

Good question , 知Python者必知Django, 因为这可是Python语言里最流行&强大的Web框架,同时亦是全球第5大WEB框架,可快速构建稳定强大的WEB项目,大大提高开发效率,很多知名项目都是基于Django开发,如Disqus、Pinterest、Instagram、Bitbucket等, Django官方Slogan是The framework for perfectionist with deadline! 一个为完美主义者且又开发工期很紧的人设计的框架,事实确实如此,Django自身集成了丰富的WEB开发通用组件,如用户认证、分页、中间件、缓存、session等,可以避免浪费大量时间重复造轮子。

 

Http原理介绍

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:

Django 14天从小白到进阶- Day1  Django 初识

HTTP协议永远都是客户端发起请求,服务器回送响应。见下图:

Django 14天从小白到进阶- Day1  Django 初识

 

这个Client和Server端本质上是一个Socket客户端和服务器端,Http协议可以说是基于Socket的再上层封装。

Django 14天从小白到进阶- Day1  Django 初识

 

 

HTTP特性

基于TCP/IP协议

你每次打开百度或其它网站,都需要先建立好TCP/IP会话,当然这个浏览器会帮你做了。

短连接

你打开 https://www.luffycity.com/  或其它网站, 当服务器端把这个页面的内容全返回后,就把这次连接断开了,会话就结束了,你在浏览器上看到页面内容已经是下载到本地的了,所以此时如果服务器端更新了内容,你本地的页面自然是不会跟着变的。除非你再刷新一下,这样就又进行了一次会话。那为何是短连接呢?你想一想

被动响应

这个很好理解,你不请求百度,百度是不会主动连接你的。

无状态

无状态是指,当浏览器发送请求给服务器的时候,服务器响应,但是同一个浏览器再发送请求给服务器的时候,他会响应,但是他不知道你就是刚才那个浏览器,简单地说,就是服务器不会去记得你,所以是无状态协议。

 

自行开发一个Web Server

既然Http协议本质上是基于Socket做的,我们又学过Socket了,那能不能自己开发一个Web Server呢? 回答是of course. 

 

# -*- coding:utf-8 -*-
# created by Alex Li - 路飞学城

import socket


def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('localhost', 8000))
    sock.listen(5)

    while True:
        # 等待浏览器访问
        conn, addr = sock.accept()
        # 接收浏览器发送来的请求内容
        data = conn.recv(1024)
        print(data)

        # 给浏览器返回内容
        conn.send(b"HTTP/1.1 200 OK\r\nContent-Type:text/html; charset=utf-8\r\n\r\n")
        conn.send("电脑前的你长的真好看!".encode("utf-8"))

        # 关闭和浏览器创建的socket连接
        conn.close()


if __name__ == "__main__":
    main()

  

我靠,这么简单,是的,就这么简单,但你现在只是返回了一句话,如果是要返回一个图片呢?一个文件呢?这就涉及你自己要负责实现文件的传送了,我们学socket传文件时,遇到过粘包问题,解决起来挺麻烦的,你现在要自己通过Socket把Http协议里的各种功能都实现了的话,估计孩子都长大了。与其浪费时间自己写,不如直接用先人的。

 

WSGI介绍

WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app(应用程序)与web server(socket服务端)之间接口格式,实现web app与web server间的解耦。

通俗的说:当规范建立后,程序就不再重复编写web server(socket服务端),而是直接使用现成的实现WSGI的模块(例如:wsgiref、uwsgi、werkzeug),从而让程序员更加专注与业务代码

与其重复造轮子,不如直接用现成的。

Python的wsgiref是基于WSGI规范封装的模块,我们可以在这个模块基础上开发我们的web server 

基于WSGI开发一个WEB服务器

# -*- coding:utf-8 -*-
# created by Alex Li - 路飞学城

from wsgiref.simple_server import make_server


def run_server(environ, start_response):
    """
    当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
    :param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
    :param start_response: 响应相关
    :return: 
    """

    start_response('200 OK',[('Content-Type', 'text/html;charset=utf-8')])
    return [bytes('<h1>我旁边的这个人长的真丑呀!!',encoding='utf-8'),]

if __name__ == '__main__':
    httpd = make_server('localhost',8001,run_server)
    httpd.serve_forever()

 

别人家的网站和我们的网站  

你看别人的网站,可以根据URL不同看到不同的内容,比如这个:煎蛋网 

但我们刚才自己开发的网站,永远只能看到同样的内容。

 

怎么办?我们自己也可以处理url呀

 1 # -*- coding:utf-8 -*-
 2 # created by Alex Li - 路飞学城
 3 
 4 from wsgiref.simple_server import make_server
 5 
 6 
 7 def western():
 8     return "欢迎来到欧美专区"
 9 
10 def japan():
11     return "欢迎来到日本人专区"
12 
13 
14 def routers():
15     """负责把url与对应的方法关联起来"""
16     urlpatterns = (
17         ('/western/',western),
18         ('/japan/',japan),
19     )
20 
21     return urlpatterns
22 
23 
24 def run_server(environ, start_response):
25     """
26     当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
27     :param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
28     :param start_response: 响应相关
29     :return: 
30     """
31     start_response('200 OK',[('Content-Type', 'text/html;charset=utf-8')])
32     url = environ.get("PATH_INFO")
33     urlpatterns = routers()
34 
35     func = None
36 
37     for item in urlpatterns:
38         if item[0] == url:
39             func = item[1]
40             break
41     if func:
42         return [bytes(func(),encoding="utf-8"),]
43     else:
44         return [bytes('404 not found.',encoding="utf-8"),]
45 
46 if __name__ == '__main__':
47     httpd = make_server('localhost',8001,run_server)
48     httpd.serve_forever()
使你的wsgi web server支持多url

相关文章: