zoukankan      html  css  js  c++  java
  • Python之Web框架

      Python之Web框架:

            

    一.  Web框架的本质:

        对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

     1 #!/usr/bin/env python
     2 #coding:utf-8
     3 
     4 #web框架的基础结构,几乎所有开发者都是基于此基础结果进行扩展。
     5 
     6 import socket
     7   
     8 def handle_request(client):
     9     buf = client.recv(1024)
    10     client.send("HTTP/1.1 200 OK
    
    ")
    11     client.send("Hello, Seven")
    12   
    13 def main():
    14     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    15     sock.bind(('localhost',8000))
    16     sock.listen(5)
    17   
    18     while True:
    19         connection, address = sock.accept()
    20         handle_request(connection)
    21         connection.close()
    22   
    23 if __name__ == '__main__':
    24     main()

    二. Web框架的实现:

      1. 基于WSGI规范:

        WSGI(Web Server Gateway Interface)是一种规范, 其目标是在Web服务器和Web框架层之间提供一个通用的API标准,减少之间的互操作性并形成统一的调用方式。解决了现在众多框架,如:Django ,Flask, web.py等共用一个标准,Django应用比较广泛。

      2. 自定义socket,代表有Tornado.

       

    Python标准库中提供了简单的参考服务器(wsgirefs): wsgiref.simple_server.WSGIServer.

     1 #!/usr/bin/env python
     2 #coding:utf-8
     3  
     4 from wsgiref.simple_server import make_server
     5  
     6 def RunServer(environ, start_response):
     7     start_response('200 OK', [('Content-Type', 'text/html')])
     8     return '<h1>Hello, web!</h1>'
     9  
    10 if __name__ == '__main__':
    11     httpd = make_server('', 8000, RunServer)
    12     print "Serving HTTP on port 8000..."
    13     httpd.serve_forever()

    三. 自定义一个Web框架:

       1. 通过python标准库提供的wsgiref模块开发一个自己的Web框架

     1 #!/usr/bin/env python
     2 #coding:utf-8
     3 from wsgiref.simple_server import make_server
     4  
     5 def index():
     6     return 'index'
     7  
     8 def login():
     9     return 'login'
    10  
    11 def routers():
    12      
    13     urlpatterns = (
    14         ('/index/',index),
    15         ('/login/',login),
    16     )
    17      
    18     return urlpatterns
    19  
    20 def RunServer(environ, start_response):
    21     start_response('200 OK', [('Content-Type', 'text/html')])
    22     url = environ['PATH_INFO']
    23     urlpatterns = routers()
    24     func = None
    25     for item in urlpatterns:
    26         if item[0] == url:
    27             func = item[1]
    28             break
    29     if func:
    30         return func()
    31     else:
    32         return '404 not found'
    33      
    34 if __name__ == '__main__':
    35     httpd = make_server('', 8000, RunServer)
    36     print "Serving HTTP on port 8000..."
    37     httpd.serve_forever()

      2. 在上一步骤中,对于所有的login、index均返回给用户浏览器一个简单的字符串,在现实的Web请求中一般会返回一个复杂的符合HTML规则的字符串,所以我们一般将要返回给用户的HTML写在指定文件中,然后再返回。如:

     1 <!DOCTYPE html>
     2 <html>
     3 <head lang="en">
     4     <meta charset="UTF-8">
     5     <title></title>
     6 </head>
     7 <body>
     8     <h1>Index</h1>
     9 
    10 </body>
    11 </html>
    12 
    13 index.html
    index
     1 <!DOCTYPE html>
     2 <html>
     3 <head lang="en">
     4     <meta charset="UTF-8">
     5     <title></title>
     6 </head>
     7 <body>
     8     <form>
     9         <input type="text" />
    10         <input type="text" />
    11         <input type="submit" />
    12     </form>
    13 </body>
    14 </html>
    15 
    16 login.html
    login
     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3  
     4 from wsgiref.simple_server import make_server
     5  
     6  
     7 def index():
     8     # return 'index'
     9     f = open('index.html')
    10     data = f.read()
    11     return data
    12  
    13  
    14 def login():
    15     # return 'login'
    16     f = open('login.html')
    17     data = f.read()
    18     return data
    19  
    20  
    21 def routers():
    22  
    23     urlpatterns = (
    24         ('/index/', index),
    25         ('/login/', login),
    26     )
    27  
    28     return urlpatterns
    29  
    30  
    31 def run_server(environ, start_response):
    32     start_response('200 OK', [('Content-Type', 'text/html')])
    33     url = environ['PATH_INFO']
    34     urlpatterns = routers()
    35     func = None
    36     for item in urlpatterns:
    37         if item[0] == url:
    38             func = item[1]
    39             break
    40     if func:
    41         return func()
    42     else:
    43         return '404 not found'
    44  
    45  
    46 if __name__ == '__main__':
    47     httpd = make_server('', 8000, run_server)
    48     print "Serving HTTP on port 8000..."
    49     httpd.serve_forever()

    注: 实际生产环境中,网页很多,不可能创建多个def函数来实现,需要分类管理,这样就引出了MVC/MTV两种框架。

    四. MVC/MTV框架:

       1. MVC框架:

         MVC是一种使用 MVC(Models Views Controllers 模型-视图-控制器)设计创建 Web 应用程序的模式: 
      • Models(模型)表示应用程序核心,操作数据库(比如数据库记录列表)。
      • Views(视图)显示数据,放置HTML模板(数据库记录)。
      • Controllers(控制器)处理用户请求(写入数据库记录)。
     
       2. MTV框架:
         MTV是一种使用MTV(Models Templates  Views 模型-模板-视图)设计创建Web应用程序的模式:
         
          Models: (模型)表示应用程序核心,操作数据库(比如数据库记录列表)。
          Templates: (模板)主要放置HTML模板(数据库记录)。
          Views: (视图)处理用户请求(写入数据库记录)。
     
    注: Django为 MTV框架。
     
     
     
     
     
     
  • 相关阅读:
    排序算法之冒泡排序的思想以及Java实现
    排序算法之希尔排序的思想以及Java实现
    c# npoi分批往excel追加数据
    c# Timer按月执行任务
    windows服务+定时任务(quartz.net)+nancy
    c# linq分组 lambda分组
    批量插入sql技巧
    解决windows server 2008R2自动关机
    c# DataGridView在使用DataSource时,只显示指定的列或禁止自动生成列
    c# mongodb时间类型字段保存时相差八个小时解决办法
  • 原文地址:https://www.cnblogs.com/python-nameless/p/5831983.html
Copyright © 2011-2022 走看看