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

    Web框架

    一 web框架

    Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。

    wsgiref模块

    最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

    如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

    正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。而wsgiref模块就是python基于wsgi协议开发的服务模块。

    undefined

    from wsgiref.simple_server import make_server
    
    def mya(environ, start_response):
        print(environ)
        start_response('200 OK', [('Content-Type', 'text/html')])
        if environ.get('PATH_INFO') == '/index':
            with open('index.html','rb') as f:
                data=f.read()
    
        elif environ.get('PATH_INFO') == '/login':
            with open('login.html', 'rb') as f:
                data = f.read()
        else:
            data=b'<h1>Hello, web!</h1>'
        return [data]
    
    if __name__ == '__main__':
        myserver = make_server('', 8011, mya)
        print('监听8010')
        myserver.serve_forever()
    

    二 手撸自己的Web框架

    models.py

    链接数据库返回字典格式:
    cursor=pymysql.cursors.DictCursor

    import pymysql
    #连接数据库
    conn = pymysql.connect(host='127.0.0.1',port= 3306,user = 'root',passwd='123456',db='web') #db:库名
    #创建游标
    cur = conn.cursor()
    
    sql='''
    create table userinfo(
            id INT PRIMARY KEY ,
            name VARCHAR(32) ,
            password VARCHAR(32)
    )
    
    '''
    
    cur.execute(sql)
    
    #提交
    conn.commit()
    #关闭指针对象
    cur.close()
    #关闭连接对象
    conn.close()
    

    myserver.py

    from wsgiref.simple_server import make_server
    
    from urls import url_patters
    
    def mya(environ, start_response):
        # print(environ)
        start_response('200 OK', [('Content-Type', 'text/html')])
        func = None
        for item in url_patters:
            if item[0] == environ.get('PATH_INFO'):
                func = item[1]
                break
        if func:
            data = func(environ)
            return [data]
        else:
            return [b'404']
    
    
    if __name__ == '__main__':
        myserver = make_server('', 8011, mya)
        print('监听8010')
        myserver.serve_forever()
    

    urls.py

    from views import *
    url_patters = [
        ('/login', login),
        ('/index', index),
        ('/time', time),
    ]
    

    views.py

    def index(environ):
        with open('templates/index.html', 'rb') as f:
            data = f.read()
        return data
    def time(environ):
        import datetime
        now=datetime.datetime.now().strftime('%y-%m-%d %X')
        print(now)
        return now.encode('utf-8')
    from urllib.parse import parse_qs
    import pymysql
    def login(request):
        if request.get("REQUEST_METHOD") == "POST":
            try:
                request_body_size = int(request.get('CONTENT_LENGTH', 0))
            except (ValueError):
                request_body_size = 0
    
            request_body = request['wsgi.input'].read(request_body_size)
            data = parse_qs(request_body)
    
            user = data.get(b"user")[0].decode("utf8")
            pwd = data.get(b"pwd")[0].decode("utf8")
    
            # 连接数据库
            conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='web')  # db:库名
            # 创建游标
            cur = conn.cursor()
            SQL = "select * from userinfo WHERE NAME ='%s' AND PASSWORD ='%s'" % (user, pwd)
            cur.execute(SQL)
    
            if cur.fetchone():
    
                f = open("templates/backend.html", "rb")
                data = f.read()
                data = data.decode("utf8")
                return data.encode("utf8")
    
            else:
                print("OK456")
                return b"user or pwd is wrong"
    
        else:
            f = open("templates/login.html", "rb")
            data = f.read()
            f.close()
            return data
    

    tempaltes下

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    登录成功
    </body>
    </html>
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    index
    </body>
    </html>
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <h4>登录页面</h4>
    <form action="http://127.0.0.1:8011/login" method="post">
         用户名 <input type="text" name="user">
         密码 <input type="text" name="pwd">
        <input type="submit">
    </form>
    </body>
    </html>
    

    三 其它socket服务端

        'cgi': CGIServer,
        'flup': FlupFCGIServer,
        'wsgiref': WSGIRefServer,
        'waitress': WaitressServer,
        'cherrypy': CherryPyServer,
        'paste': PasteServer,
        'fapws3': FapwsServer,
        'tornado': TornadoServer,
        'gae': AppEngineServer,
        'twisted': TwistedServer,
        'diesel': DieselServer,
        'meinheld': MeinheldServer,
        'gunicorn': GunicornServer,
        'eventlet': EventletServer,
        'gevent': GeventServer,
        'geventSocketIO':GeventSocketIOServer,
        'rocket': RocketServer,
        'bjoern' : BjoernServer,
        'auto': AutoServer,
    

    都遵循一个协议wsgi(Web Server Gateway Interface web服务网关接口)

  • 相关阅读:
    【leetcode】416. Partition Equal Subset Sum
    【leetcode】893. Groups of Special-Equivalent Strings
    【leetcode】892. Surface Area of 3D Shapes
    【leetcode】883. Projection Area of 3D Shapes
    【leetcode】140. Word Break II
    【leetcode】126. Word Ladder II
    【leetcode】44. Wildcard Matching
    【leetcode】336. Palindrome Pairs
    【leetcode】354. Russian Doll Envelopes
    2017.12.22 英语面试手记
  • 原文地址:https://www.cnblogs.com/Dr-wei/p/11823519.html
Copyright © 2011-2022 走看看