Django:web框架本质

一,web框架本质html

咱们能够这样理解:全部的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样咱们就能够本身实现Web框架了。python

1,自定义web框架web

import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen() while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"OK") conn.close()

2,HTTP协议数据库

每一个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。 HTTP响应的Header中有一个 Content-Type代表响应的内容格式。如 text/html表示HTML网页。django

1)HTTP GET请求的格式:浏览器

GET /path HTTP/1.1 header1:v1\r\n header2:v2\r\n

使用 \r\n分隔多个header服务器

2)HTTP POST请求格式:框架

POST /path HTTP/1.1 header1:v1\r\n header2:v2\r\n \r\n\r\n 请求体...

当遇到连续两个 \r\n\r\n时,表示Header部分结束了,后面的数据是Body。socket

3)HTTP响应的格式:函数

200 OK Header1:v1\r\n Header2:v2\r\n \r\n\r\n 响应体...

3,根据不一样的路径返回不一样的内容

"""
根据URL中不一样的路径返回不一样的内容--函数版
"""

import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 8080)) # 绑定IP和端口
sk.listen() # 监听


# 将返回不一样的内容部分封装成函数
def index(url):
s = "这是{}页面!".format(url)
return bytes(s, encoding="utf8")


def home(url):
s = "这是{}页面!".format(url)
return bytes(s, encoding="utf8")


while 1:
# 等待链接
conn, add = sk.accept()
data = conn.recv(8096) # 接收客户端发来的消息
# 从data中取到路径
data = str(data, encoding="utf8") # 把收到的字节类型的数据转换成字符串
# 按\r\n分割
data1 = data.split("\r\n")[0]
url = data1.split()[1] # url是咱们从浏览器发过来的消息中分离出的访问路径
conn.send(b'HTTP/1.1 200 OK\r\n\r\n') # 由于要遵循HTTP协议,因此回复的消息也要加状态行
# 根据不一样的路径返回不一样内容,response是具体的响应体
if url == "/index/":
response = index(url)
elif url == "/home/":
response = home(url)
else:
response = b"404 not found!"

conn.send(response)
conn.close()

4,返回具体的HTML页面

""" 根据URL中不一样的路径返回不一样的内容--函数进阶版 返回HTML页面 让网页动态起来 """

import socket import time sk = socket.socket() sk.bind(("127.0.0.1", 8080))  # 绑定IP和端口
sk.listen()  # 监听


# 将返回不一样的内容部分封装成函数
def index(url): with open("index.html", "r", encoding="utf8") as f: s = f.read() now = str(time.time()) s = s.replace("@@oo@@", now)  # 在网页中定义好特殊符号,用动态的数据去替换提早定义好的特殊符号
    return bytes(s, encoding="utf8") def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系
list1 = [ ("/index/", index), ("/home/", home), ] while 1: # 等待链接
    conn, add = sk.accept() data = conn.recv(8096)  # 接收客户端发来的消息
    # 从data中取到路径
    data = str(data, encoding="utf8")  # 把收到的字节类型的数据转换成字符串
    # 按\r\n分割
    data1 = data.split("\r\n")[0] url = data1.split()[1]  # url是咱们从浏览器发过来的消息中分离出的访问路径
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 由于要遵循HTTP协议,因此回复的消息也要加状态行
    # 根据不一样的路径返回不一样内容
    func = None  # 定义一个保存将要执行的函数名的变量
    for i in list1: if i[0] == url: func = i[1] break
    if func: response = func(url) else: response = b"404 not found!"

    # 返回具体的响应消息
 conn.send(response) conn.close()

5,服务器程序与应用程序

对于真实开发中的python web程序来讲,通常会分为两部分:服务器程序和应用程序。

服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各类数据进行整理。

应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不一样的框架有不一样的开发方式,可是不管如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。

 

这样,服务器程序就须要为不一样的框架提供不一样的支持。这样混乱的局面不管对于服务器仍是框架,都是很差的。对服务器来讲,须要支持各类不一样框架,对框架来讲,只有支持它的服务器才能被开发出的应用使用。

这时候,标准化就变得尤其重要。咱们能够设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就能够配合使用。一旦标准肯定,双方各自实现。这样,服务器能够支持更多支持标准的框架,框架也可使用更多支持标准的服务器。

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

经常使用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,

1)wsgiref

""" 咱们利用wsgiref模块来替换咱们本身写的web框架的socket server部分: 根据URL中不一样的路径返回不一样的内容--函数进阶版 返回HTML页面 让网页动态起来 wsgiref模块版 """

import time from wsgiref.simple_server import make_server # 将返回不一样的内容部分封装成函数
def index(url): with open("index.html", "r", encoding="utf8") as f: s = f.read() now = str(time.time()) s = s.replace("@@oo@@", now) return bytes(s, encoding="utf8") def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系
list1 = [ ("/index/", index), ("/home/", home), ] def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO']  # 取到用户输入的url
    func = None for i in list1: if i[0] == url: func = i[1] break
    if func: response = func(url) else: response = b"404 not found!"
    return [response, ] if __name__ == '__main__': httpd = make_server('127.0.0.1', 8090, run_server) print("我在8090等你哦...") httpd.serve_forever()

2)jinja2

从数据库中查询数据,而后去替换我html中的对应内容,而后再发送给浏览器完成渲染。 这个过程就至关于HTML模板渲染数据。 本质上就是HTML内容中利用一些特殊的符号来替换要展现的数据,模板渲染的工具: jinja2

from wsgiref.simple_server import make_server from jinja2 import Template def index(): with open("index2.html", "r") as f: data = f.read() template = Template(data)  # 生成模板文件
    ret = template.render({"name": "Alex", "hobby_list": ["烫头", "泡吧"]})  # 把数据填充到模板里面
    return [bytes(ret, encoding="utf8"), ] def home(): with open("home.html", "rb") as f: data = f.read() return [data, ] # 定义一个url和函数的对应关系
URL_LIST = [ ("/index/", index), ("/home/", home), ] def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO']  # 取到用户输入的url
    func = None  # 将要执行的函数
    for i in URL_LIST: if i[0] == url: func = i[1]  # 去以前定义好的url列表里找url应该执行的函数
            break
    if func:  # 若是能找到要执行的函数
        return func()  # 返回函数的执行结果
    else: return [bytes("404没有该页面", encoding="utf8"), ] if __name__ == '__main__': httpd = make_server('', 8000, run_server) print("Serving HTTP on port 8000...") httpd.serve_forever()

二,Django

1,建立一个Django项目

django-admin startproject mysite

2,运行Django项目

python manage.py runserver 127.0.0.1:8000

3,配置文件

1)模板文件配置:

TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, "template")],  # template文件夹位置
        'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]

2)静态文件配置

STATIC_URL = '/static/'  # HTML中使用的静态文件夹前缀
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static"),  # 静态文件存放位置
]

在配置文件中暂时禁用csrf中间件,方便表单提交测试

 三,Django基础

from django.shortcuts import HttpResponse, render, redirect

1,HttpResponse

 内部传入一个字符串参数,返回给浏览器。

 

def index(request): # 业务逻辑代码
    return HttpResponse("OK")

2,render

除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。

将数据填充进模板文件,最后把结果返回给浏览器。(相似于咱们上面用到的jinja2)

def index(request): # 业务逻辑代码
    return render(request, "index.html", {"name": "aaa", "hobby": ["111", "222"]})

3,redirect

#接受一个URL参数,表示跳转到指定的URL。
def index(request): # 业务逻辑代码
    return redirect("/home/")
相关文章
相关标签/搜索