Web框架

Posted tmesh-python

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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协议开发的服务模块。

wsgiref简单应用

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框架

架构

1.纯手撸web框架
1.手动书写socket

? 2.手动处理http格式数据

2.基于wsgiref模块
该模块实现了上面两个手动的过程

? 根据功能不同拆分成了不同的py文件

? urls.py 只放路由与视图函数对应关系

? views.py 放视图函数(函数,类)(放的是视图函数(处理业务逻辑的))

? templates 模板文件夹(一堆html文件)

? 拆分完成之后 如果想要添加功能,你仅仅只需要在上面两个地方动手脚就可以了
?
3.动静态网页

? 静态网页

? 数据是写死的 万年不变
? 动态网页

? 数据是实时获取的

? eg:
? 1.后端获取当前时间展示到前端

? 2.后端获取数据库中的数据展示到前端

疑问:
如何将后端获取的数据 传递给html页面

后端获取的数据 传递给html页面  >>>:  模板的渲染

jinja2  
pip3 install jinja2

模板语法(极其贴近python后端语法)
    <p>{{ user }}</p>
    <p>{{ user.name }}</p>
    <p>{{ user['pwd'] }}</p>
    <p>{{ user.get('hobby') }}</p>
    {% for user_dict in user_list %}
        <tr>
            <td>{{ user_dict.id }}</td>
            <td>{{ user_dict.name }}</td>
            <td>{{ user_dict.pwd }}</td>
        </tr>
    {% endfor %}

技术图片

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下

backend.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
登录成功
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
index
</body>
</html>

login.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服务网关接口)

以上是关于Web框架的主要内容,如果未能解决你的问题,请参考以下文章

web代码片段

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

代码片段 - Golang 实现简单的 Web 服务器

高效Web开发的10个jQuery代码片段

高效Web开发的10个jQuery代码片段

web前端开发JQuery常用实例代码片段(50个)