3.Django(web框架 并发动态版、jinja2、wsgire、分目录)
我们之前始终写的都是静态页面,静态页面与动态页面不是以页面动与不动为标准的,动态页面是指后端与数据库交互提取相关数据结合html统一发送给浏览器。
思路:浏览器输入ip地址和端口访问我的服务端,通过服务端url匹配,执行相应的函数,函数中将html文件读出来形成一个大的字符串,然后通过大字符串的格式化输出替换掉某个位置的元素,替换成数据库取出来的数据,然后将这个被替换的html大字符串send给浏览器。
-
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框架

浙公网安备 33010602011771号