zoukankan      html  css  js  c++  java
  • WEB框架

    1.所有的WEB框架或WEB请求本质上是什么?
    答:所有的WEB框架或WEB请求本质上是一个socket。

    2.http是什么呢?
    答:服务端无论通过Apache还是nginx实现,只要服务端运行,本质上就是一个socket服务端;
    浏览器充当的是socket客户端,浏览器去服务器端请求,建立一次TCP链接。连接完成之后,一次请求,一次响应。咔-断开了!
    断开了之后,客户端再次发送请求给服务器端,服务器端这时是不知道客户端是谁的。
    所以说,http是无状态的。

    3.自己写一个服务端:所有的web框架的本质就是这15行代码。

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # Author:Zoe
     4 import socket
     5 def handle_request(client):
     6     buf = client.recv(1024)
     7     client.send("HTTP/1.1 200 OK
    
    ".encode("utf-8"))
     8     client.send("Hello, Seven".encode("utf-8"))
     9 def main():
    10     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    11     sock.bind(('localhost', 800))
    12     sock.listen(5)
    13     while True:
    14         connection, address = sock.accept()
    15         handle_request(connection)
    16         connection.close()
    17 if __name__ == '__main__':
    18     main()
    View Code

    在浏览器界面输入:localhost:800或127.0.0.1:800,浏览器界面返回“Hello, Seven”。

    在这个服务器端,绑定ip是自己写的。

    4.在Python中,python标准库提供的独立WSGI服务器称为wsgiref。wsgiref模块帮我们封装好了socket,只要定义函数调用模块内部已经封装好了的socket。
    注:WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,实现web app与web server间的解耦。

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # Author:Zoe
     4 from wsgiref.simple_server import make_server
     5 def RunServer(environ, start_response):  
     6     #environ封装了所有从客户端发来的数据;
     7     #start_response封装要返回给用户的数据,比方说:响应头,状态码等
     8     start_response('200 OK', [('Content-Type', 'text/html')])
     9     return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]  #返回的内容
    10 if __name__ == '__main__':
    11     httpd = make_server('', 8000, RunServer)  #首先创建一个socket服务端,当有客户端连接进来,会触发RunServer方法。
    12     print("Serving HTTP on port 8000...")
    13     httpd.serve_forever()
    View Code

    5.实际网页访问过程中,通过在url中传入的不同的参数返回不同的结果。那么,怎么获取用户在url中传入的值呢?
    如:http://www.cnblogs.com/zoe233中传入了zoe233.
    实例:

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # Author:Zoe
     4 from wsgiref.simple_server import make_server
     5 
     6 def handle_index():
     7     return [b'<h1>Hello,index</h1>',]
     8 
     9 def handle_data():
    10     return ['<h1>Hello,data!</h1>'.encode('utf-8'),]
    11 
    12 URL_DICT={
    13     '/index':handle_index,
    14     '/data':handle_data,
    15 }
    16 def RunServer(environ, start_response):
    17     start_response('200 OK', [('Content-Type', 'text/html')])
    18     current_url=environ['PATH_INFO']
    19     func=None
    20     if current_url in URL_DICT:
    21         func=URL_DICT[current_url]
    22     if func:
    23         return func()
    24     else:
    25         return [b'<h1>404</h1>',]
    26 
    27     # return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
    28 if __name__ == '__main__':
    29     httpd = make_server('', 8000, RunServer)
    30     print("Serving HTTP on port 8000...")
    31     httpd.serve_forever()
    View Code

    运行上述实例,在浏览器界面输入127.0.0.1:800/data,返回“Hello,data!”;

    在浏览器界面输入127.0.0.1:800/index,返回“Hello,index”;
    在浏览器界面输入127.0.0.1:800/2333,返回“404”;
    在上面的实例中,我们通过debug查看所有从客户端发来的信息中,字段PATH_INFO存储了url后面的参数值。通过environ['PATH_INFO']获取参数值,再通过字典映射函数,通过if判断让服务端相应相对应的反馈。

    6.在实际网页中,有诸如下一页,第一页等传入信息为#p1,#p2的url参数的传入是如何实现的呢?
    因为用上面的方法,会产生大量的重复的无用函数。
    我们可以用正则表达式来作为匹配对象,将同类的参数归为一类。
    如http://www.cnblogs.com/zoe233/default.html?page=3中将参数“/zoe233/default.html?page=3”写成“*page=d$”


    7.上面的实例中,返回的值是我们自己写的,可以返回文件吗?
    可以。
    实例:

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # Author:Zoe
     4 from wsgiref.simple_server import make_server
     5 
     6 def handle_index():
     7     f=open("index.html",mode='rb')
     8     data=f.read()
     9     f.close()
    10     return [data,]
    11 
    12 def handle_data():
    13     return ['<h1>Hello,data!</h1>'.encode('utf-8'),]
    14 
    15 URL_DICT={
    16     '/index':handle_index,
    17     '/data':handle_data,
    18 }
    19 def RunServer(environ, start_response):
    20     start_response('200 OK', [('Content-Type', 'text/html')])
    21     current_url=environ['PATH_INFO']
    22     func=None
    23     if current_url in URL_DICT:
    24         func=URL_DICT[current_url]
    25     if func:
    26         return func()
    27     else:
    28         return [b'<h1>404</h1>',]
    29 
    30     # return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
    31 if __name__ == '__main__':
    32     httpd = make_server('', 8000, RunServer)
    33     print("Serving HTTP on port 8000...")
    34     httpd.serve_forever()
    View Code

    8.如果页面特别多,我们可以将所有的html文件放在一个文件夹内,以后要打开文件只要加上文件的路径即可。如View。
    如果函数特别多,我们可以将所有的函数都在一个文件夹内。如Controller。调用函数时只要import Controller模块即可。
    数据库文件都放在Model.
    这种写法分为好几中WEB框架的写法:
      MVC
      Model   View        Controller
      数据库  模板文件 业务处理


      MTV

      Model   Template   View
      数据库  模板文件   业务处理


    WEB框架:MVC、MTV
    MVC、MTV的区别在于文件目录名称的区别。

  • 相关阅读:
    Ubuntu18.04安装配置
    Ubuntu Terminal「控制台」
    Ubuntu16.04系统安装
    UEFI Install CentOS 7
    安装Ubuntu16.04后要做的事
    Ubuntu Google Chrome
    Nuke Linux Crack
    Selenium3自动化测试实战 基于Python语言
    函数基础
    Jenkins持续集成
  • 原文地址:https://www.cnblogs.com/zoe233/p/7567196.html
Copyright © 2011-2022 走看看