您的位置:首页 > 编程语言 > Go语言

web框架-django方式添加路由

2017-12-22 20:42 441 查看
在说框架之前,先要了不同的资源请求。

什么是静态资源?

一般不需要经常变化的资源—文件系统

什么是动态资源?

需要经常变化的数据—数据库

为什么有了web服务器还有web框架?

web应用程序会经常变动,如果和web服务器一起,会影响服务器,将它们分开可以更好的修改

当浏览器发来动态请求的时候,它会将请求转给浏览器框架来处理,减轻了服务器的压力,各司其职更好的完善自己

静态资源为什么不用web框架处理? 动态资源需要呢?

静态资源是基本不变化,处理发送都比较简单,web服务器可以直接处理

动态资源和业务相关,需要经常变化,处理起来比较麻烦,需要单独的用web框架来处理

web服务器和web框架之间需要协议就是上文所说的WSGI 协议

在WSGI的协议中,我们将每次请求的路径分别的与各个函数比较,在函数少的时候,还可以接受

但是当函数很多,就不适用了。我们应该用另外一种方式来保存地址和地址对应的函数

所以要引入一个概念:路由

路由概念来源于路由器。

路由器中有一个列表,该列表使得路由器具有一种能力-根据数据包要送到的目的地址而决定下一站地址。

Web开发概念中的路由概念与此类似-根据HTTP请求路径的不同决定不同的执行代码。

在Django中用的就是这种方式

在路由列表中 每一条叫做路由 (路径,路径对应的执行的函数)

路由列表 [(),(),()]

如:

g_route_list = [
('/gettime.py', gettime),
('/index.py', index),
('/center.py', center),
('/update.py', update)
]


对照WSGI那篇文章的例子,相当于把查询数据进行了优化,虽然前提是,我们需要将每一个函数都写进去,

但是这样非常的一目了然的知道各个函数以及对应的路径

抛出web框架的代码:
import time
import re

# 指定模板文件资源 所在的根目录
TEMPLATE_ROOT = "./template"

def gettime(path_info):
"""当用户请求/gettime.py的时候执行该函数代码"""
return time.ctime()

def center(path_info):
"""当用户请求/index.py的时候执行该函数代码"""
# 读取模板文件
# /index.py ----》 /index.html
path_info = path_info.replace(".py", ".html")

with open(TEMPLATE_ROOT + path_info) as file:
html = file.read()

# 将模板文件的数据进行 替换 --正则替换 {%content%}
data_from_mysql = "这是从数据库中查询出来的相关信息"
html = re.sub(r"\{%content%\}",data_from_mysql,html)

return html

def update(path_info):
"""当用户请求/index.py的时候执行该函数代码"""
# 读取模板文件
# /index.py ----》 /index.html
path_info = path_info.replace(".py", ".html")

with open(TEMPLATE_ROOT + path_info) as file:
html = file.read()

# 将模板文件的数据进行 替换 --正则替换 {%content%}
data_from_mysql = "这是从数据库中查询出来的相关信息"
html = re.sub(r"\{%content%\}",data_from_mysql,html)

return html

def index(path_info):
path_info = path_info.replace(".py", ".html")

with open(TEMPLATE_ROOT + path_info) as file:
html = file.read()

data_from_mysql = "这是从数据库中查询出来的相关信息"
html = re.sub(r"\{%content%\}",data_from_mysql,html)

return html

g_route_list = [ ('/gettime.py', gettime), ('/index.py', index), ('/center.py', center), ('/update.py', update) ]

def app(environ, start_response):
path_info = environ['PATH_INFO']

# 当用户访问已经实现了功能的路径 就返回200 OK 其余的返回404 Not Found
# if path_info == '/gettime.py':
# start_response('200 OK', [('Content-Type', 'text/html'),
# ("Server", "PythonWebServer")])
# return gettime(path_info)
# elif path_info == '/index.py':
# # 读取模板文件 并且进行替换 然后通过返回值返回给web服务器
# start_response('200 OK', [('Content-Type', 'text/html'),
# ("Server", "PythonWebServer")])
# return index(path_info)
# elif path_info == '/center.py':
# # 读取模板文件 并且进行替换 然后通过返回值返回给web服务器
# start_response('200 OK', [('Content-Type', 'text/html'),
# ("Server", "PythonWebServer")])
# return center(path_info)
# elif path_info == '/update.py':
# # 读取模板文件 并且进行替换 然后通过返回值返回给web服务器
# start_response('200 OK', [('Content-Type', 'text/html'),
# ("Server", "PythonWebServer")])
# return update(path_info)
# 遍历路由列表 看其中哪一条信息符合用户的请求路径 如果符合就执行路径对应的函数
for url,func in g_route_list:
if path_info == url:
start_response('200 OK', [('Content-Type', 'text/html'),
("Server", "PythonWebSe
4000
rver")])
return func(path_info)

else:
# app函数的返回值就是响应体
start_response('404 Not Found', [('Content-Type', 'text/html'),
("Server", "PythonWebServer")])
return 'Hello World!!!!!' + str(environ)

就是把最后的对应查找部分进行了优化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  web服务器