标签:href env 平台 styles ict 安全 框架 pre 内置浏览器
Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。
C/S模式:C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。
B/S模式:B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来运行。WEB应用程序一般是B/S模式。
从本质上看:B/S模式也是C/S模式
浏览器/服务器架构(Browser/Server,简称B/S)能够很好地应用在广域网上,成为越来越多的企业的选择。浏览器/服务器架构相对于其他几种应用程序体系结构,有如下3方面的优点:
总结一下,本质上:浏览器是一个socket客户端,服务器是一个socket服务端
# 手撸web框架.py
# 你可以将web框架理解成服务端
import socket
server=socket.socket()
server.bind(("127.0.0.1",8080))
server.listen(5)
while True:
conn,addr =server.accept()
data = conn.recv(1024)
print(data) #二进制
conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
data = data.decode("urf-8") #字符串
# 获取字符串中特定的内容 正则 如果字符串有规律也可以考虑用切割
conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
current_path = data.split(" ").[1]
# print(current_path)
if current_path =="/index":
# conn.send(b"index heiheihei") #发送字符串
with open(r"template/01 myhrml.html","rb") as f: #发送文件
conn.send(f.read())
elif current_path =="/login":
conn.send(b"login")
else:
# 你直接忽略favicon.ico
conn.send(b"hello web")
conn.close()
# 01 myhtml.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h1>你好啊 宝贝</h1>
</body>
</html>
# 02 基于wsgiref模块.py
from wsgiref.simple_server import make_server
from urls import urls
from views import *
def run(env,response):
"""
env:请求相关的所有的所有数据
response:响应相关的所有数据
return:返回浏览器的数据·
"""
# print(env) #大字典,wsgiref模块帮你处理好http格式的数据 封装成了字典让你更加方便的操作
# 从env中取
response("200 ok",[]) #响应首行 响应头
current_path = env.get("PATH_INFO")
# if current_path =="/index":
#return [b"index"]
# elif current_path =="/login":
# return [b"login"]
# return [b"404 error"]
# 定义一个变量 存储匹配到的函数名
func = None
for url in urls: # url (),()
if current_path ==url[0]:
# 将url对应的函数名赋值给func
func = url[1]
break #匹配到一个之后 应该立即结束for 循环
# 判断func是否有值
if func:
res = func(env)
else:
res = error(env)
return [res.encode("utf-8")]
if __main__ =="__main__":
server=make_server("127.0.0.1",8080,run)
‘‘‘
会实时监听127.0.0.1:8080的地址 只要有客户端来了 都会交给run函数处理(加括号触发run函数的运行)
flask 启动源码
make_server("127.0.0.1",8080,obj)
__call__
‘‘‘
server.serve_forever() #启动服务器
from view import *
# url 与视图函数的对应关系
urls=[
("/index",index),
("/login",login),
("/xxx",xxx)
]
# views.py 文件
def index(env):
return "index"
def login(env):
return "login"
def xxx(env):
with open(r"templates/02 myxxx.html","r",encoding="utf-8") as f:
return f.read()
def error(env):
return "404 error"
urls.py 路由与视图函数对应关系
views.py 视图函数(后端业务逻辑)
templates文件夹 专门存放html文件
按照功能的不同拆分之后 后续添加功能只需要在urls.py书写对应关系 然后去views.py书写业务逻辑即可
静态网页
页面上的数据是直接写死的 万年不变
动态网页
数据是实时获取的
eg:
1.后端获取当前时间 展示到html页面上
2.数据从数据库中获取的 展示到html页面上
#urls.py 文件
from view import *
# url 与视图函数的对应关系
urls=[
("/index",index),
("/login",login),
("/xxx",xxx)
("/get_time",get_time)
]
view.py文件
import datetime
def get_time(env):
current_time=datatime.datatime.new().strtime("%Y-%m-%d %X")
# 如何将后端获取的数据“传递”给html文件?
with open(r"templates/03 mytime.html","r",encoding="utf-8") as f:
data = f.read()
# data就算一堆字符串
data = data.replace("ooxx",current_time) #在后端将html页面处理好之后返回给前端
return data
temlates文件夹下 03 mytime.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h1>我真的是一个html文件</h1>
ooxx
</body>
</html>
from jinja2 import Template
def get_dict(env):
user_dict = {"username":"jason","age":18,"hobby":"read"}
with open(r"template/04 get_dict.html","r",encoding="utf-8") as f:
data = f.read()
tmp = Template(data)
res = tmp.render(user=user_dic)
# get_dict.html 传递了一个值 页面上通过变量名user就能够拿到user_dict
return res
"""模版语法是在后端起作用的"""
# 模版语法(非常贴近python语法)
{{ user }}
{{ user.get(‘username‘)}}
{{ user.age }}
{{ user[‘hobby‘] }}
{% for user_dict in user_list %}
<tr>
<td>{{ user_dict.id}}</td>
<td>{{ user_dict.username}}</td>
<td>{{ user_dict.password}}</td>
<td>{{ user_dict.hobby}}</td>
</tr>
{% endfor%}
#urls.py 文件
from view import *
# url 与视图函数的对应关系
urls=[
("/index",index),
("/login",login),
("/xxx",xxx),
("/get_time",get_time),
("/get_dict",get_dict)
]
views.py文件
import pymysql
def get_user(env):
# 去数据库中获取数据 传递给html页面 借助于模版语法 发送给浏览器
conn = pymysql.connect(
host ="127.0.0.1",
port = 3306,
user = "root",
password ="123",
db="day059",
charset = "utf-8",
autocommit = True
)
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
sql = "select * from t1"
affect_rows = cursor.execute(sql)
data_list = cursor.fetchall()
#将获取的数据传递给html文件
with open(r"templates/111.html","r",encoding="utf-8") as f:
data = f.read()
tmp = Template(data)
res = tmp.render(user_list=data_list)
return res
templates文件下 111.html文件、
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 class = "text-center">用户数据</h1>
<table class="table table-hover table-striped">
<thead>
<tr>
<th>ID</th>
<th>username</th>
<th>password</th>
<th>hobby</th>
</tr>
</thead>
<tbody>
{% for user_dict in user_list %}
<tr>
<td>{{ use_dict.id }}</td>
<td>{{ use_dict.username }}</td>
<td>{{ use_dict.password }}</td>
<td>{{ use_dict.hobby }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
wsgire 模块
1.请求来的时候解析http格式的数据 封装成大字典
2.响应走的时候给数据打包成符合http格式 再返回给浏览器
标签:href env 平台 styles ict 安全 框架 pre 内置浏览器
原文地址:https://www.cnblogs.com/ydz1993/p/13231377.html