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的区别在于文件目录名称的区别。

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    微信小程序TodoList
    C语言88案例-找出数列中的最大值和最小值
    C语言88案例-使用指针的指针输出字符串
  • 原文地址:https://www.cnblogs.com/zoe233/p/7567196.html
Copyright © 2011-2022 走看看