zoukankan      html  css  js  c++  java
  • DjangoAgain_用小程序理解web框架

    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')
    
    
  • 相关阅读:
    SharePoint 2013 配置基于表单的身份认证
    SharePoint 2013 场解决方案包含第三方程序集
    SharePoint 2010 站点附加数据升级到SP2013
    SharePoint 2013 在母版页中插入WebPart
    SharePoint 2013 搭建负载均衡(NLB)
    SharePoint 部署解决方案Feature ID冲突
    SharePoint 2013 配置基于AD的Form认证
    SharePoint Server 2016 Update
    SharePoint 2013 为用户组自定义EventReceiver
    SharePoint 2013 JavaScript API 记录
  • 原文地址:https://www.cnblogs.com/scott-lv/p/7511008.html
Copyright © 2011-2022 走看看