前端:可视界面,用户操作的界面
数据库:专门用于存取数据,用户无法直接操作
web框架:将前端和数据库整合到一起,提供一个功能较为完整的框架
web框架:将前端、数据库整合到一起,基于互联网传输的python代码,web框架在软件开发目录里中,也可以简单的理解为是‘服务器’
思路整理
1.搭建简易版本 socket模块 2.遵循HTTP协议 四大特性、数据格式、响应状态码 3.基于不同后缀响应不同的内容 如何获取用户输入的url后缀>>>:HTTP请求数据 /favicon.ico可以直接忽略,用不上 利用字符串切割和索引取值获取相应数据
开始撸代码!
客户端: import socket server = socker.socket() # 创建服务器对象 server.bind(('127.0.0.1',8008)) # 链接端口号 server.listen(5) # 创建半链接池 while True: sock, addr = server.accept() # 获取客户端信息和端口号 data = sock.recv(1024) # 暂时不考虑黏包问题,直接按照1024接受 data_str = data.decode('utf8') # 将请求相关的信息转换先转我字符串 # 'GET /login HTTP/1.1\r\nHost: 127.0.0.1:8081\r\n......' sock.send(b'HTTP1.1 200 OK\r\n\r\n') # 写入http协议 current_path = data_str.split(' ')[1] # 用字符串中截取出我们需要的内容(按照空额切割字符串,获取第二个元素) # 根据后缀的不同返回不同的内容 if current_path == '/login': sock.send(b'hello login!!!') # 由于我们是使用浏览器展示,需要转换为二进制数据 elif current_path == '/register': sock.send(b'hello register') # 不同的文本数据 else: sock.send(b'404 error') 使用浏览器http://127.0.0.1:8080/进入地址 通过修改地址栏中的后缀可以获得相对于的文本数据
上面的框架虽然可以基本满足一个地址下不同的后缀会返回不同的内容,但是还很不完善
因为我们是纯手撸的代码,类似于这种不太好处理的,但是你暗暗觉得肯定有方法解决的,大概率是有模块可以去使用的,这就是python工程师的舒服了
from wsgiref import simple_server # 调用模块 from urls import urls # 调用urls后缀字典 from views import error # 调用功能函数 服务端 def run(request, response): """ :param request: 请求相关的数据 :param response: 响应相关的数据 :return: 返回给客户端的展示数据 """ print(request) # 字典类型的数据(模块自动处理HTTP请求数据 便于后续数据获取) # 除了数据还会返回类似访问的日志 response('200 OK', []) # 固定编写 无需掌握 current_path = request.get("PATH_INFO") # 获取地址后缀名 func_name = None # 变量名赋值None for url_tuple in urls: # ('/register', register) 用变量名接受urls(后缀匹配字典)循环赋值 if current_path == url_tuple[0]: # 比对后缀与后缀字典 func_name = url_tuple[1] # 将后缀字典中对应的v键赋值给变量名 break # 直接返回出去 # for循环运行完毕之后 func_name也有可能是None if func_name: # 如果变量名不为空 res = func_name(request) # 运行函数,顺手将request也传给函数 else: res = error(request) return [res.encode('utf8')] # 将res按照utf8编码并返回出去 if __name__ == '__main__': server = simple_server.make_server('127.0.0.1', 8080, run) '''一致监听本机8080端口 一旦有请求访问 自动触发run方法的执行''' server.serve_forever()
后缀字典另起python文件
from views import * # 后缀匹配 urls = ( ('/register', register), ('/login', login), ('/index', index), ('/func', func), ('/get_time', get_time), ('/get_dict', get_dict), ('/get_db', get_db) )
然后写入调用功能函数,展示不同的页面
# 功能函数 def register(request): return 'register' def login(request): return 'login' def index(request): return 'index' def func(request): # 满足的调用该函数 with open(r'templates/func.html', 'r', encoding='utf8') as f: return f.read() def error(request): # 不满足条件的调用该函数,读取error文件返回文本 with open(r'templates/error.html', 'r', encoding='utf8') as f: return f.read()
前端html页面
error页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>404页面</h1> </body> </html> func页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>func页面</h1> </body> </html>
上述代码已经按照不同的部分拆分在各个py文件中了,以后需要新增功能直接在urls.py添加对应关系,view.py中编写函数即可。
html所学的css、js、第三方框架代码都是写完之后很少做改动的文件 所以可以统一存放在某个文件夹下
static文件夹:存储项目所需的'静态文件'
页面上的数据是直接写死的,类似于error.html func.html
页面上的数据是通过代码动态获取的 实时可变 eg: 1.页面上展示当前时间(后端获取传递给前端界面) 2.页面上展示数据库数据(后端链接数据库查询数据再传递给页面)
动态网页1:
def get_time(request): # 1.获取当前时间 import time c_time = time.strftime('%Y-%m-%d %X') # 2.读取html文件 with open(r'templates/get_time.html','r',encoding='utf8') as f: data = f.read() # 3.思考:如何给字符串添加一些额外的字符串数据>>>:字符串替换 new_data = data.replace('asdaksdjal',c_time) return new_data
简介:第三方模块,pip3 install jinja2
功能:在编写前后端不分离项目的时候,可以使用该模块提供的模板语法简单快速的在html页面是使用类似于后端的代码语法操作数据
模板语法(简单了解):
temp_obj.render({'user':user_dict,'new_list':new_list}) <p>{{ user }}</p> <p>{{ user.name }}</p> <p>{{ user['pwd'] }}</p> <p>{{ user.get('hobby') }}</p> {% for i in new_list %} <span>元素:{{ i }}</span> {% endfor %}
urls.py 后缀与函数名对应关系 ('/index',register) 后缀专业名词称之为'路由' 函数名专业名词称之为'视图函数' urls.py专业名词称之为'路由层' views.py 专门编写业务逻辑代码 可以是函数 也可以是类 函数专业名词称之为'视图函数' 类专业名词称之为'视图类' views.py专业名词称之为'视图层' templates文件夹 专门存储html文件 html文件专业名词称之为'模板文件' templates文件夹专业名词称之为'模板层
django 大而全 自带的功能非常的多 但是有时候会略显笨重 类似于'重装堡垒' flask 小而精 自带的功能非常的少 但是第三方模块非常的多 类似于'游骑兵' # flask的第三方模块加到一起甚至比django还多 并且也越来越像django # flask由于过多的依赖于第三方模块 有时候也会受制于第三方模块 tornado 异步非阻塞框架 速度极快 甚至可以用于充当游戏服务器 # 还有一些占比较小 但是也很厉害的框架 fastapi、sanic......
版本问题: django3.X:默认支持异步功能 django2.X:默认不支持异步 django1.X:默认不支持异步 默认使用django1.X版本,该版本最稳定。 启动问题 django启动可能报错的原因 1.计算机名称不能含有中文 2.不同版本的解释器可能会报错 找到报错信息的最后一行提示对应的代码 删除源文件逗号即可 eg: 解释器推荐使用python3.6 几乎不会报错 解释器如果是高版本使用django1.11可能会报错 解释器如果是低版本使用django2、3也可以报错 3.项目中所有的文件名称最好使用英文 4.一个pycharm窗口尽量就是一个完整的项目 不要嵌套 下载地址:pip3 install django==1.11.11
下载成功
# 验证是否下载成功 cmd窗口直接输入django-admin有反应就是成功了 # 命令操作django 1.创建django项目 django-admin startproject 项目名(mysite) 2.启动django项目 cd 项目名(mysite) python3 manage.py runserver IP:PORT 3.创建app应用 python3 manage.py startapp 应用名(app01) '''命令行无法自动创建模板文件夹 需要自己执行命令创建''' # pycharm操作django 1.new project 选择django 填写应用即可 '''pycharm默认会自动帮你创建模板文件夹 并提供创建一个app的功能''' 2.创建更多的app tools run manage.py task 命令自动提示 3.启动项目 直接点击绿色箭头 还可以修改端口号 edit configurations
django本身只是一个框架,顾名思义,框架就是一个空壳子,真正的功能还是按照框架里面的各个应用来决定的。
# settings.py 项目配置文件 # urls.py 路由层