DjangoAgain_用小程序理解web框架

理解WSGI与Django
本文解析了Python Web程序的基本组成及工作原理,通过一个简易示例解释了WSGI的作用,以及URL与视图间的协作过程,并展示了如何使用Jinja2模板引擎呈现动态内容。

Django再来一遍

## 理解web框架

Python web程序一般分成两个部分:

  • 服务器程序:对socket服务器进行封装;对请求的数据进行整理
  • 应用程序:负责实现具体的逻辑

应用程序一定会有很多种,但是服务器程序一定要配合应用程序,那么有几个应用程序就要有几种服务器程序吗。
让服务器可以支持更多框架,框架也能更多支持标准的服务器,出现了WSGI(web sever gateway interface)
定义了使用Python编写web app和web server之间的接口格式。

用分析一个小程序,来理解框架中url和views之间的协作过程。

from wsgiref.simple_server import make_server
 
def index():
    return 'index'
    # 定义一个index函数,用于返回字符串index
 
def login():
    return 'login'
 
def routers():
     # 一个路由函数,里面保存了路径和运行函数的对应元组,返回值为所有对应元组的集合元组;
     # 眼熟吗,是不是很像urls.py里面的:
     """
        urlpatterns = [
        url(r'^admin/', admin.site.urls),

        url(r'^all/(?P<type_id>\d+)/', views.index),
        # 通过url的别名传递type_id给后台
        url(r'^login.html', views.login),
        url(r'^check_code/', views.check_code),
        url(r'^', views.index),
    ]
     """
    urlpatterns = (
        ('/index/',index),
        ('/login/',login),
    )
     
    return urlpatterns
 
def RunServer(environ, start_response):
    # 响应runserver中传入的这两个参数分别代表什么?一个字典,一个函数名
    
    start_response('200 OK', [('Content-Type', 'text/html')])
    # 响应
    url = environ['PATH_INFO']
    # 将path_info获取为url,实际上path_info这个参数的确也可以获得url
    urlpatterns = routers()
    #获取路由路径元组
    func = None
    # 在全局设置一个func变量,暂时为None
    for item in urlpatterns:    
        if item[0] == url:
            func = item[1]
            break
    # 在路由元组中匹配获得的url,如果匹配成功就break,获取到对应的func值
    if func:
        return func()
    # func值存在的时候,就运行对应的函数 ------views.app
    else:
        return '404 not found'
        # 否则就报错不存在
     
if __name__ == '__main__':
    httpd = make_server('', 8000, RunServer)
    print "Serving HTTP on port 8000..."
    httpd.serve_forever()

上面的小程序,index函数和login函数返回的仅仅是简单的字符串,但是实际应用中,应该返回的是一个具体的页面(“复杂的符合HTML规则的字符串”)。并且这个页面被放在指定的文件夹中。

这时候需要改写一下:

def index():
    f=open('index.html')
    data=f.read()
    return data

做到这一步,我们已经能给用户返回静态的html内容了。如何给用户返回动态的内容?

  • 自定义一套特殊的语法,进行替换
  • 使用开源工具jinja2,遵循指定语法
from wsgiref.simple_server import make_server
from jinja2 import Template
# 眼熟吗系列,这个tamplate是Django里面的那个tamplate吗
 
 
def index():
    # return 'index'
 
    # template = Template('Hello {{ name }}!')
    # 这条注释是用来表示在jinja中的前端页面,使用什么语法来获得后端返回数据的。
    # result = template.render(name='John Doe')
 
    f = open('index.html')
    result = f.read()
    #读取html页面的内容
    template = Template(result)
    # 实例化一个Template,内容就是刚才读取的页面
    data = template.render(name='John Doe', user_list=['alex', 'eric'])
    # 利用Template类中的render方法(眼熟吗)传入两个变量(其实这种xx=zz的形式不是可以看成是字典吗)
    return data.encode('utf-8')

转载于:https://www.cnblogs.com/scott-lv/p/7511008.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值