web框架可以简单的理解为是基于互联网web服务端 >>>:socket服务端
TCP服务端
import socket
server=socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(3)
while True:
sock,address=server.accept()
sock.send(bytes('hello','utf8'))
res=sock.recv(1024)
基于TCP协议 HTTP协议服务端
import socket
server=socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(3)
while True:
sock,address=server.accept()
sock.send(bytes(b'HTTP/1.1 200 OK\r\n\r\nhello','utf8'))
res=sock.recv(1024)
推导 通过 网址不同请求不同的内容
从请求数据格式中筛选出用户输入的网址后缀
target_url = data.decode('utf8').split(' ')[1]
代码的缺陷
import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
sock,address=server.accept()
data = sock.recv(1024)
sock.send(b'HTTP/1.1 200 OK\r\n\r\n')
target_url = data.decode('utf8').split(' ')[1]
if target_url =='/index':
sock.send(b'index view')
elif target_url =='/login':
sock.send(b'login view')
elif target_url =='/reg':
sock.send(b'reg view')
else:
sock.send(b'404 reeor')
wsgiref 内部封装了socket代码 和对请求数据的处理
wsgiref 模块解决了 两个问题
socket 代码重复编写问题
针对请求数据格式的处理复杂且重复
from wsgiref.simple_server import make_server
def run(request, response):
"""
:param request: 请求数据
:param response: 响应数据
:return: 返回客户端数据
"""
print(request) # Zion给将 请求数据全部处理成字典k:v键值对形式
response('200 ok', []) # 固定代码 无需掌握
return [b'hello big baby']
if __name__ == '__main__':
server = make_server('127.0.0.1',8080,run) #任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
server.serve_forever() # 永久启动
思考如何再次实现根据不同的网址后缀返回不同的内容
先从字典中查找出记录网址后缀的键值对
if
判断def index(reuest):
return 'index'
def login(request):
return'login'
def register(request):
return 'register'
def error(request):
return '404 error'
urls = (
('/index',index),
('/login',login),
('/register',register),
)
根据py文件中功能的不同划分到不同的py文件(模块化)
文件名 | 功能 |
---|---|
urls.py |
对应关系 |
views.py |
功能函数 |
start.py |
启动文件 |
templates |
存储html |
动态网页
页面上的数据不是全部写死的 有些是动态获取(后端传入)
静态网页
页面上的数据直接写死的 要想改变只能修改源码
后端代码获取当前时间 然后让前端页面展示
字符串替换
将字典数据传递给html页面并且想要在页面上操作字典数据
我们之前所学 无法自己实现>>>:在html页面上使用类似于后端的语法操作数据
jinja2能够让我们在html文件内使用类似于后端的语法来操作各种数据类型
pip3 install inja2
from jinja2 import Template
def get_dict(request):
user_dict = {'name':'jason','pwd':123,'hobby':['read','run','music']}
with open(r'templates/myhtml104.html','r',encoding='utf8') as f:
data = f.read()
temp = Template(data)
res = temp.render(data=user_dict) #将字典传递给html页面 页面上通过data即可获取
return res
<h1>{{data}}h1> 以标题一炸死你hi字典
<h1>
{{data['name']}}
h1> 获取字典 键name
<h1>
{{data.get('pwd')}}
h1> 获取键pwd
<h1>
{{data.hoby}}
h1> 获取键hoby
{% for uer in user_data %}
<tr>
<td>{{user.id}}td>
<td>{{user.name}}td>
<td>{{user.age}}td>
tr>
{% endfor %} jinjia2 中for循环 语法
django框架
大而全 自身携带的功能非常的多 类似于航空母舰
flask框架
小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块
缺陷:受限于第三方模块的开发
tornado框架
一步非阻塞 该框架快到可以作为游戏服务器
缺陷:上手难度是三者最高的
fastapi框架、sanic框架 …
最近比较流行的
框架虽多 但是内部逻辑大差不差 我们重点学习一个即可>>>:django
如果你是小白切记不要同时学习上述框架
版本问题
1.X:同步
2.X:同步
3.X:异步
你无论使用上面版本都可以 区别不大 2.2
启动注意事项
计算机名称 尽量不要有中文
项目中所有的py文件名尽量不要用中文
不同版本的python解释器配合不同版本的django 会有一些报错
仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错
找到那一行代码 把逗号删除即可
widgets.py 152
一个pycharm 窗口只允许有一个项目 不要坐项目的嵌套
验证django 是否 下载成功
cmd终端输入django-admin
命令行操作
操作django项目
django-admin startproject 项目名
启动django项目
先切换到项目目录下
cd 项目名
执行启动目录
pytho38 manage.py runserver ip:port
访问django服务端
浏览器直接访问
创建app应用
python38 manage.py startapp 应用名
django框架类似于是一个空壳子 给你提供所需的资源
至于到底要写哪些功能 需要通过创建app来划分
eg:django 初始项目可以看成是一所大学
app就相当于是大学里面的各个学员
命令行不会自动创建templates文件夹
命令行不会再配置文件编写关于templates
文件夹配置
'DIRS':[os.path.join(BASE_DIR,'templates')]
pycharm 自动创建的第一个应用会自动注册到配置文件中
针对db.sqlites3
文件不用去在乎它没有创建 只要运行了django 会自动出来
文件名 | 主要作用 |
---|---|
__init__.py |
很少用 主要做一些冷门的配置 |
settings.py |
项目配置文件 |
urls.py |
对应关系 |
wsgi.py |
django服务 基本不用 |
manage.py |
django入口文件 |
存储项目所需的html文件
文件名 | 作用 |
---|---|
migations文件夹 |
orm相关(数据库打交道的记录) |
__init__.py |
很少用 主要做一些冷门配置 |
admin.py |
django自带的后台管理 |
apps.py |
创建应用之后用于应用的注册 |
models.py |
存储与数据库 表 相关的类 |
tests.py |
自带测试文件 |
tests.py |
自带的测试文件 |
views.py |
存储业务相关的逻辑代码(函数、类) |
db.sqlite3 |
自带的小型数据库 |
特殊核心 文件
urls.py
路由层:记录对应关系
views.py
视图层:核心逻辑层(
templates
模板层:专门存html文件
models.py
模型层:存储与数据库 表 相关的类
HttpRespinse
主要用于直接返回字符串类型数据
def index(request):
return HttpResponse('heillo django2222')
render
主要用于返回html页面 并且支持模板语法
def func(request):
user_dict={'name':'kk','pwd':'123'}
return render(request,'a.html',{'data':user_dict})
redirect
主要用于页面重定向
def login(request):
return redirect('https://www.baidu.com')
def mysql(request):
import pymysql
conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='html_db',
charset='utf8',
autocommit=True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'select * from html1'
cursor.execute(sql)
user_data = cursor.fetchall()
return render(request,'mysql.html',{'user_data':user_data})
mysql.html
<body>
<div class="container">
<div class="row">div>
<h1 class="text-center">用户信息h1>
<table class="table table-bordered table-hover">
<thead>
<tr class="info">
<th>编号th>
<th>用户th>
<th>密码th>
tr>
thead>
<tbody>
{% for user_list in user_data %}
<tr class="danger">
<td>{{ user_list.id }}td>
<td>{{ user_list.name }}td>
<td>{{ user_list.pwd }}td>
tr>
{% endfor %}
tbody>
table>
div>
body>