zoukankan      html  css  js  c++  java
  • 第五十五章 Django介绍了解+web框架本质

    http 协议:
    https://www.cnblogs.com/clschao/articles/9230431.html
    
    pip 安装源
    pip国内的一些镜像
    
      阿里云 http://mirrors.aliyun.com/pypi/simple/ 
      中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 
      豆瓣(douban) http://pypi.douban.com/simple/ 
      清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 
      中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
    
    修改源方法:
    
    临时使用: 
    可以在使用pip的时候在后面加上-i参数,指定pip源 
    eg: pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    永久修改: 
    linux: 
    修改 ~/.pip/pip.conf (没有就创建一个), 内容如下:
    
    [global]
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple
    1
    2
    windows: 
    直接在user目录中创建一个pip目录,如:C:Usersxxpip,在pip 目录下新建文件pip.ini,内容如下
    
    或者按照网友的建议:win+R 打开用户目录%HOMEPATH%,在此目录下创建 pip 文件夹,在 pip 目录下创建 pip.ini 文件, 内容如下
    
    [global]
    
    timeout = 6000
    
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple
    
    trusted-host = pypi.tuna.tsinghua.edu.cn
    

    web框架本质

    所有的web应用本质上就是一个socket服务端,而用户的浏览器时一个socket客户端
    

    web框架功能

    1.socket收发消息--wsgiref测试、uwsgi线上
    2.根据不同的路径返回不同的字符串
    3.返回动态页面(字符串的替换 模版的渲染) --jinja2
    

    web框架种类

    1.django
        根据不同的路径返回不同的字符串
        返回动态页面(字符串的替换 模版的渲染)
    2.flask
        根据不同的路径返回不同的字符串
    3.tornado
        socket 收发消息
        根据不同的路径返回不同的字符串
        返回动态页面(字符串的替换)
    

    自定义web框架

    1.示例一:socket服务端

       import socket
       # 创建一个socket对象
       sk = socket.socket()
       # 绑定IP和端口
       sk.bind(('127.0.0.1', 8000))
       # 监听
       sk.listen(5)
       # 等待连接
       while True:
           conn, addr = sk.accept()
           # 接收数据
           data= conn.recv(1024)
           print(data)
           # 返回数据
           conn.send(b'HTTP/1.1 200 OK
    
    <h1>ok!</h1>')
           # 断开连接
           conn.close()
    
    1. 示例二:根据不同路径返回不同的内容(普通版)
       import socket
       # 创建一个socket对象
       sk = socket.socket()
       # 绑定IP和端口
       sk.bind(('127.0.0.1', 8000))
       # 监听
       sk.listen(5)
       # 等待连接
       while True:
           conn, addr = sk.accept()
           # 接收数据
           data = conn.recv(1024)
           data = data.decode('utf-8')
           url = data.split()[1]
           conn.send(b'HTTP/1.1 200 OK
    
    ')
           if url == '/index/':
               # 返回数据
               conn.send(b'<h1>index!</h1>')
           elif url == '/home/':
               conn.send(b'<h1>home!</h1>')
           else:
               conn.send(b'<h1>404 not found!</h1>')
           # 断开连接
           conn.close()
    
    1. 示例三:根据不同路径返回不同的内容(函数版)
       import socket
       # 创建一个socket对象
       sk = socket.socket()
       # 绑定IP和端口
       sk.bind(('127.0.0.1', 8000))
       # 监听
       sk.listen(5)
       # 函数
       def index(url):
           ret = '<h1>index!</h1>({})'.format(url)
           return ret.encode('utf-8')
       def home(url):
           ret = '<h1>home!</h1>({})'.format(url)
           return ret.encode('utf-8')
       # 等待连接
       while True:
           conn, addr = sk.accept()
           # 接收数据
           data = conn.recv(1024)
           data = data.decode('utf-8')
           url = data.split()[1]
           conn.send(b'HTTP/1.1 200 OK
    
    ')
           if url == '/index/':
               # 返回数据
               ret = index(url)
           elif url == '/home/':
               ret = home(url)
           else:
               ret = b'<h1>404 not found!</h1>'
           conn.send(ret)
           # 断开连接
           conn.close()
    
    1. 示例四:根据不同路径返回不同的内容(函数进阶版)
       import socket
       # 创建一个socket对象
       sk = socket.socket()
       # 绑定IP和端口
       sk.bind(('127.0.0.1', 8000))
       # 监听
       sk.listen(5)
       # 函数
       def index(url):
           ret = '<h1>index!</h1>({})'.format(url)
           return ret.encode('utf-8')
       def home(url):
           ret = '<h1>home!</h1>({})'.format(url)
           return ret.encode('utf-8')
       # 定义一个list1和实际要执行的函数的对应关系 
       list1 = [
           ('/index/', index),
           ('/home/', home),
       ]
       # 等待连接
       while True:
           conn, addr = sk.accept()
           # 接收数据
           data = conn.recv(1024)
           data = data.decode('utf-8')
           url = data.split()[1]
           conn.send(b'HTTP/1.1 200 OK
    
    ')
           func = None
           for i in list1:
               if url == i[0]:
                   func = i[1]
                   break
           if func:
               ret = func(url)
           else:
               ret = b'<h1>404 not found!</h1>'
           conn.send(ret)
           # 断开连接
           conn.close()
    
    1. 示例五:返回HTML页面
       import socket
       # 创建一个socket对象
       sk = socket.socket()
       # 绑定IP和端口
       sk.bind(('127.0.0.1', 8000))
       # 监听
       sk.listen(5)
       # 函数
       def index(url):
           with open('index.html','rb') as f:
               ret = f.read()
           return ret
       def home(url):
           ret = '<h1>home!</h1>({})'.format(url)
           return ret.encode('utf-8')
       # 定义一个list1和实际要执行的函数的对应关系
       list1 = [
           ('/index/', index),
           ('/home/', home),
       ]
       # 等待连接
       while True:
           conn, addr = sk.accept()
           # 接收数据
           data = conn.recv(1024)
           data = data.decode('utf-8')
           url = data.split()[1]
           conn.send(b'HTTP/1.1 200 OK
    
    ')
           func = None
           for i in list1:
               if url == i[0]:
                   func = i[1]
                   break
           if func:
               ret = func(url)
           else:
               ret = b'<h1>404 not found!</h1>'
           conn.send(ret)
           # 断开连接
           conn.close()
    
    1. 示例六:返回动态页面
       import socket
       import time
       # 创建一个socket对象
       sk = socket.socket()
       # 绑定IP和端口
       sk.bind(('127.0.0.1', 8000))
       # 监听
       sk.listen(5)
       # 函数
       def index(url):
           with open('index.html', 'rb') as f:
               ret = f.read()
           return ret
       def home(url):
           ret = '<h1>home!</h1>({})'.format(url)
           return ret.encode('utf-8')
       def timer(url):
           now = time.strftime('%H:%M:%S')
           with open('time.html','r',encoding='utf-8') as f:
               data = f.read()
           data = data.replace('xxtimexx',now)
       
           return data.encode('utf-8')
       # 定义一个list1和实际要执行的函数的对应关系
       list1 = [
           ('/index/', index),
           ('/home/', home),
           ('/time/', timer),
       ]
       # 等待连接
       while True:
           conn, addr = sk.accept()
           # 接收数据
           data = conn.recv(1024)
           data = data.decode('utf-8')
           url = data.split()[1]
           conn.send(b'HTTP/1.1 200 OK
    
    ')
           func = None
           for i in list1:
               if url == i[0]:
                   func = i[1]
                   break
           if func:
               ret = func(url)
           else:
               ret = b'<h1>404 not found!</h1>'
           conn.send(ret)
           # 断开连接
           conn.close()
    

    补充:time.html

         <!DOCTYPE html>
         <html lang="en">
         <head>
             <meta charset="UTF-8">
             <title>Title</title>
         </head>
         <body>
         <h1>当前时间是:@@time@@</h1>
         </body>
         </html>
    

    wsgiref

    常用的WSGI服务器有uWSGI、Gunicorn
    - Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器
    
    1. 示例:
       """  
       根据URL中不同的路径返回不同的内容--函数进阶版  
       返回HTML页面  
       让网页动态起来  
       wsgiref模块版  
       """       
       from wsgiref.simple_server import make_server     
           
       # 将返回不同的内容部分封装成函数   
       def index(url):   
           # 读取index.html页面的内容   
           with open("index.html", "r", encoding="utf8") as f:   
               s = f.read()   
           # 返回字节数据   
           return bytes(s, encoding="utf8")       
            
       def home(url):   
           with open("home.html", "r", encoding="utf8") as f:   
               s = f.read()   
           return bytes(s, encoding="utf8")       
            
       def timer(url):   
           import time   
           with open("time.html", "r", encoding="utf8") as f:   
               s = f.read()   
               s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S"))   
           return bytes(s, encoding="utf8")        
            
       # 定义一个url和实际要执行的函数的对应关系   
       list1 = [   
           ("/index/", index),   
           ("/home/", home),   
           ("/time/", timer),   
       ]        
            
       def run_server(environ, start_response):   
           start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息   
           url = environ['PATH_INFO']  # 取到用户输入的url   
           func = None   
           for i in list1:   
               if i[0] == url:   
                   func = i[1]   
                   break   
           if func:   
               response = func(url)   
           else:   
               response = b"404 not found!"   
           return [response, ]      
            
       if __name__ == '__main__':   
           httpd = make_server('127.0.0.1', 8090, run_server)   
           print("我在8090等你哦...")   
           httpd.serve_forever()  
    

    jinja2

    1. 模板渲染现成的工具:jinja2
      下载jinja2:pip install jinja2

    2. 示例:

       from wsgiref.simple_server import make_server  
       from jinja2 import Template    
         
       def index(url):  
           # 读取HTML文件内容  
           with open("index2.html", "r", encoding="utf8") as f:  
               data = f.read()  
               template = Template(data)   # 生成模板文件 
               ret = template.render({'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头']})   # 把数据填充到模板中  
           return bytes(ret, encoding="utf8")  
         
       def home(url):  
           with open("home.html", "r", encoding="utf8") as f:  
               s = f.read()  
           return bytes(s, encoding="utf8")  
         
       # 定义一个url和实际要执行的函数的对应关系  
       list1 = [  
           ("/index/", index),  
           ("/home/", home),  
       ]   
         
       def run_server(environ, start_response):  
           start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息  
           url = environ['PATH_INFO']  # 取到用户输入的url  
           func = None  
           for i in list1:  
               if i[0] == url:  
                   func = i[1]  
                   break  
           if func:  
               response = func(url)  
           else:  
               response = b"404 not found!"  
           return [response, ]  
         
       if __name__ == '__main__':  
           httpd = make_server('127.0.0.1', 8090, run_server)  
           print("我在8090等你哦...")  
           httpd.serve_forever() 
    

    补充:index2.html

         <!DOCTYPE html>
         <html lang="zh-CN">
         <head>
           <meta charset="UTF-8">
           <meta http-equiv="x-ua-compatible" content="IE=edge">
           <meta name="viewport" content="width=device-width, initial-scale=1">
           <title>Title</title>
         </head>
         <body>
             <h1>姓名:{{name}}</h1>
             <h1>爱好:</h1>
             <ul>
                 {% for hobby in hobby_list %}
                 <li>{{hobby}}</li>
                 {% endfor %}
             </ul>
         </body>
         </html>
    
  • 相关阅读:
    【C++】C++ primer 第三章学习笔记
    【C++】C++ primer 第二章学习笔记
    【C++】C++ primer 第一章学习笔记
    【C++】C++ sort函数
    【C++】C++ primer 第五版 Sales_item.h源码
    【其他】MarkDown的使用
    Dockerfile最佳实践
    docker跨主机通信--模拟flannel host-gw直接路由
    pod 生命周期hook钩子函数
    docker mysql 修改密码
  • 原文地址:https://www.cnblogs.com/zhangshan33/p/11576741.html
Copyright © 2011-2022 走看看