3.Django(web框架 并发动态版、jinja2、wsgire、分目录)

并发动态版web框架

我们之前始终写的都是静态页面,静态页面与动态页面不是以页面动与不动为标准的,动态页面是指后端与数据库交互提取相关数据结合html统一发送给浏览器。

思路:浏览器输入ip地址和端口访问我的服务端,通过服务端url匹配,执行相应的函数,函数中将html文件读出来形成一个大的字符串,然后通过大字符串的格式化输出替换掉某个位置的元素,替换成数据库取出来的数据,然后将这个被替换的html大字符串send给浏览器。

  • socket

    import socket
    from threading import Thread
    import time
    from models import get_data
    ​
    server = socket.socket()
    ​
    server.bind(('127.0.0.1',8001))
    server.listen(5)
    ​
    def html(conn):
      with open('html页面.html',mode='r',encoding='utf-8') as f1:
          # 将数据库取出来的数据与html结合然后在发送出去
          from_databases_data = get_data()
          result = f1.read().format(teacher_name = from_databases_data['tname'])
          conn.send(result.encode('utf-8'))
          conn.close()
    ​
    def css(conn):
      with open('test.css',mode='rb') as f1:
          conn.send(f1.read())
          conn.close()
    ​
    def js(conn):
      with open("test.js", mode='rb') as f1:
          conn.send(f1.read())
          conn.close()
    ​
    def icon(conn):
      with open('favicon.ico', mode='rb') as f1:
          conn.send(f1.read())
          conn.close()
    ​
    url_list = [
      ('/',html),
      ('/test.css',css),
      ('/test.js',js),
      ('/fabicon.ico',icon)
    ]
    ​
    while 1:
      conn,addr = server.accept()
      from_client_data = conn.recv(1024).decode('utf-8')
      print(from_client_data)
      path = from_client_data.split('\r\n')[0].split()[1]
      print(path)
    ​
      conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
      for url_tuple in url_list:
          if url_tuple[0] == path:
              t = Thread(target=url_tuple[1],args=(conn,))
              t.start()
  • html页面

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <title>并发动态web框架</title>
      <link rel="stylesheet" href="test.css">
    </head>
    <body>
      <div><h1>欢迎{teacher_name}来到皇家洗脚城</h1></div>
      荣誉会员
      <ul>
          <li>客户1</li>
          <li>客户2</li>
          <li>客户3</li>
      </ul>
    ​
      <script src="test.js"></script>
    </body>
    </html>
    ​
  • css

    div{
      height:100px;
     
    }
  • settings

    import pymysql
    ​
    conn = pymysql.connect(
      host = '127.0.0.1',
      port = 3306,
      user = 'root',
      password='000',
      database = 'you_yong',
      charset = 'utf8',
    )
  • models

    import pymysql
    from settings import conn
    ​
    def get_data():
      cursor = conn.cursor(pymysql.cursors.DictCursor)
      cursor.execute("select tname from teacher where tid=1")
      data = cursor.fetchone()
      cursor.close()
      conn.close()
      return data

 

jinja2模板语言

jinjia2模板语言,模板渲染,专门用于前端的数据在发送到浏览器之前,相应位置进行替换(有点类似于格式化输出)但是它比格式化输出功能多很多,并且进价2适用于各种python的web框架(flask,Django,tonardo等等)。Django框架中自带一个模板渲染系统与jinjia2非常类似。

  • socket

    import socket
    from threading import Thread
    import time
    from models import get_data
    from jinja2 import Template
    ​
    server = socket.socket()
    ​
    server.bind(('127.0.0.1',8001))
    server.listen(5)
    ​
    def html(conn):
      with open('html页面.html',mode='r',encoding='utf-8') as f1:
          # 将数据库取出来的数据与html结合然后在发送出去
          from_databases_data = get_data()
          #result = f1.read().format(teacher_name = from_databases_data['tname'])
    ​
          data = f1.read()
          # 实例化对象
          temp = Template(data)
          result = temp.render({'teachers':from_databases_data})
    ​
          conn.send(result.encode('utf-8'))
          conn.close()
    ​
    def css(conn):
      with open('test.css',mode='rb') as f1:
          conn.send(f1.read())
          conn.close()
    ​
    def js(conn):
      with open("test.js", mode='rb') as f1:
          conn.send(f1.read())
          conn.close()
    ​
    def icon(conn):
      with open('favicon.ico', mode='rb') as f1:
          conn.send(f1.read())
          conn.close()
    ​
    url_list = [
      ('/',html),
      ('/test.css',css),
      ('/test.js',js),
      ('/fabicon.ico',icon)
    ]
    ​
    while 1:
      conn,addr = server.accept()
      from_client_data = conn.recv(1024).decode('utf-8')
      print(from_client_data)
      path = from_client_data.split('\r\n')[0].split()[1]
      print(path)
    ​
      conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
      for url_tuple in url_list:
          if url_tuple[0] == path:
              t = Thread(target=url_tuple[1],args=(conn,))
              t.start()
  • html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <title>并发动态web框架</title>
      <link rel="stylesheet" href="test.css">
    </head>
    <body>
      <div><h1>欢迎{{teachers}}来到皇家洗脚城</h1></div>
      荣誉会员
      <ul>
          <!--<li>客户1</li>-->
          <!--<li>客户2</li>-->
          <!--<li>客户3</li>-->
          {% for item in teachers %}
              <li>{{item.tname}}</li>
          {% endfor %}
      </ul>
    ​
      <script src="test.js"></script>
    </body>
    </html>
    ​

     

wsgiref版web框架

我们的web后端一般分为两部分:服务器相关,逻辑相关,主要写两部分程序,服务器程序,逻辑程序

服务器程序:

逻辑程序:

 

服务器程序:处理socket通信,http协议,请求相关信息、响应先关信息

逻辑程序:数据库、pyhton的代码、具体的相关业务等等

 

我们作为开发主要精力应该放在处理逻辑程序部分,为了方便我们开发,创建不同的框架:Django、flask、web.py 等等最开始帮助我们更好的处理逻辑程序。如果我们已进⼊公司先花去3年时间研究底层通信以及⽹络请求等等相关的信息,在写逻辑代码就不合理了了。4

针对于这种情况,有⼈就制定⼀个规范:WSGI(Web Server Gateway Interface)就是⼀种规范,它

定义了使⽤Python编写的web应⽤程序与web服务器程序之间的接⼝格式,实现web应⽤程序与web服务器程序间的解耦。

现在服务器程序很多:uwsgi、Gunicorn、wsgiref等等。

我们先看⼀下wsgiref测试代码:

from wsgiref.simple_server import make_server
# wsgiref本身就是一个wrb框架,提供了一些固定的功能(请求和响应信息的封装,
# 不需要我们自己写原生的socket了也不需要咱们自己来完成请求信息的提取了、提取起来方便)
​
# 函数名字随便起
def application(environ,start_response):
  '''
  :param enbiron: 是全部加⼯好的请求信息,加⼯成了⼀个字典,通过字典取值的⽅式就能拿到很
多你想要拿到的信息
  :param start_response: 帮你封装响应信息的(响应⾏和响应头),注意下⾯的参数
  :return:
  '''
  start_response('200 OK', [('k1','v1'),])
  print(environ)
  print(environ['PATH_INFO']) # #输⼊地址127.0.0.1:8000,这个打印的是'/',输⼊的是127.0.0.1:8000/index,打印结果是'/index'
  return [b'<h1>Hello, web!</h1>']
​
#和咱们学的socketserver那个模块很像啊
httpd = make_server('127.0.0.1', 8001, application)
print('Serving HTTP on port 8080...')
# 开始监听HTTP请求:
httpd.serve_forever()

 

socket

from models import get_data
from jinja2 import Template
from wsgiref.simple_server import make_server



def html(conn):
    with open('html页面.html',mode='r',encoding='utf-8') as f1:
        # 将数据库取出来的数据与html结合然后在发送出去
        data = f1.read()
        # 实例化对象
        temp = Template(data)
        result = temp.render({'teachers':from_databases_data})
        return result.encode('utf-8')

def css(conn):
    with open('test.css',mode='rb') as f1:
        return f1.read()

def js(conn):
    with open("test.js", mode='rb') as f1:
        return f1.read()

def icon(conn):
    with open('favicon.ico', mode='rb') as f1:
        return f1.read()

url_list = [
    ('/',html),
    ('/test.css',css),
    ('/test.js',js),
    ('/fabicon.ico',icon)
]

def application(environ,start_response):
    start_response('200 OK',[('k1','v1'),])
    for url_tuple in url_list:
        if url_tuple[0] == environ['PATH_INFO']:
            ret = url_tuple[1]()
            return [ret]
    else:
        return [b'<h1>404 sb!!!</h1>']

httpd = make_server('127.0.0.1',8080,application)
print('Serving HTTP on port 8080...')
httpd.serve_forever()

其他页面一样

 

 

起飞版web框架

 

posted @ 2020-05-19 10:39  牧羊小董  阅读(236)  评论(0)    收藏  举报