01django框架
纯手撸web框架
""" web框架:将前端 数据库整合到一起基于互联网传输的python代码 web框架也可以简单的理解为是软件开发架构里面的'服务端' """ #1.搭建简易版本服务端 socket模块 #2.遵循HTTP协议 四大特性/数据格式/响应状态码 #3.基于不同的后缀响应不同的内容 如何获取用户输入的url后缀>>>:HTTP请求数据 /favicon.icon直接忽略 不影响判断 利用字符串切割和索引获取相应的数据 import socket server = socket.socket() server.bind(('127.0.0.1',8080)) server.listen(5) while True: sock, addr = server.accept() data = sock.recv(1024) #将请求相关数据先转成字符串 data_str = data.decode('utf8') sock.send(b'HTTP1.1 200 OK\r\n\r\n') #然后去字符串中截取出我们需要的内容(按照空格切割字符串 获取第二个元素即可) 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') """ 上述框架缺陷: 1.服务端起始代码过于重复 2.针对HTTP请求数据没有完善的处理方式 3。并发量问题 """
基于wsgiref模块
#1,利用模块搭建服务端 #2,利用模块处理好的HTTP字典数据编写业务 查找用户url后缀对象的键值对数据 from wsgiref import simple_server def run(request, response): """ :param request:请求相关的数据 :param requese:响应相关的数据 :return:返回给客户端展示的数据 """ #print(request) #字典类型的数据(模块自动处理HTTP请求数据便于后续数据获取) response('200 OK', []) #固定编写 无需掌握 current_path ==request.get('PATH_INFO') if current_path == '/login': return [b'hello login html'] elif current_path == '/register': return [b'hello register html'] return [b'404 error'] if __name__ == '__main__': server = simple_server.make_server('127.0.0.1', 8080, run) """一致监听本机8080端口 一旦有请求访问 自动触发run方法的执行""" server.server_forever()
优化措施
1.如果网站很多 是不是就是一味的添加elif? 2.每个分支下的功能根据业务逻辑的不同可能会比较复杂 '上述两个问题需要做优化处理' 将匹配和功能封装成 元组和函数 '将所有的代码全部放在一个py文件过于冗余 不便于后期管理和维护' 根据功能的不同拆分成不同的批py文件 urls.py 对应关系的储存(例如元组) views.py 业务逻辑的编写(比如元组对应的函数) #以后要想新增功能 只需在urls.py中添加对应关系views.py中编写函数 '业务函数的代码中 可能会频繁的使用到不同的html页面' 为了避免文件类型的混乱 单独开设一个文件夹储存储存所有的html文件 templates文件夹 储存项目所需的html文件 '项目中的html文件 也有可能需要用到css/js/第三方框架文件' html所学的css/js/第三方框架代码都是写完之后很少做改动的文件 所以可以统一放在某个文件夹下 static文件夹 储存项目所需的'静态文件'(后续再讲) 基于上述优化之后 整个项目结构清晰 维护管理方便!!!
动静态网页
静态网页 页面上的数据是直接写死的 万年不变 eg:上述项目中的编写的 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('efervreverv', c_time) return new_data 案列2:将字典传递给页面 并且在页面上 还可以使用字典的操作方法 jinja2模板语法
jinja2模块
#第三方模块 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 %} #获取数据库中的数据展示到前端页面 还是用的上述模板语法
框架请求流程
参考群内截图:仅限于我们自己编写的web框架(真正的框架其实和这个差不多) urls.py 后缀与函数名对应关系 ('/index',register) 后缀专业名词称之为'路由' 函数名专业名词称之为'视图函数' urls.py专业名词称之为'路由层' views.py 专门编写业务逻辑代码 可以是函数 也可以是类 函数专业名词称之为'视图函数' 类专业名词称之为'视图类' views.py专业名词称之为'视图层' templates文件 专门储存html文件 html文件专业名词称之为'模板文件' templates文件夹专业名词称之为'模板层'
python主流web框架
django 大而全 自带的功能非常的多 但是有时候会略显笨重 flask 小而精 自带的功能非常的少 但是第三方模块非常的多 #flask的第三方模块加到一起甚至比django还多 并且也越来越像django #flask由于过多的依赖第三方模块 有时候也会受制于第三方模块 tornado 异步非阻塞框架 速度极快 神甚至可以充当用于游戏的服务器 #还要一些占比比较小 但是也很厉害的框架 fastapi sanic...... """ 框架的核心逻辑几乎是一致的 我们在学习的时候只需要先学会一种 之后就可以触类旁通 但是需要强调的是:千万不要同时学习!!! """
django框架简介
#版本问题 django3.x默认支持异步功能 django2.x默认不支持异步 django2.x默认不支持异步 ''' 我们学习的时候 可以基于django1.11.x版本与2.x功能几乎一致 3.x仅仅是多了一个功能(并且该功能不完善 半成品!!!) ''' django1.11.x LTS 2018年发布 django2.x LTS 2020年发布 #之前使用的是1.11 有些新项目逐步过渡到2.2 自己私下也研究过3.2 (面试时候回答老一些的版本,说明自己工作年限长!!) #启动问题 django启动可能报错的原因 1.计算机名称不能含有中文 直接修改即可 2.不同版本的解释器可能会报错 找到报错信息的最后一行提示对应的代码 删除源文件逗号即可 eg:解释器推荐使用python3.6 几乎不会报错 解释器如果是高版本 使用django1.11可能会报错 解释器如果是低版本 使用django2/3也可以报错 3.项目中所以文件名最好使用英文 4.一个pycharm窗口尽量就是一个完整的项目 不要嵌套 #下载 pip3 install django==1.11.11 '''如果之前下载了其他版本不要管 自动替换'''
django的基本使用
#验证是否下载成功 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
应用app
django本身类似于一个空壳子 真正的功能思由里面的各个应用决定
django框架相当于一所大学 应用相当于是大学里面的各个学院
大学其实是个空壳子 负责提供环境
学院才是一个个真正具备特定功能的集合
eg:
使用django写一个淘宝
淘宝里面有很多功能模块
我们应该先创建一个空的django项目 然后根据功能不同创建不同的应用
django项目
app01(user)
app02(order)
app03(goods)
app04(backend)
django主要文件介绍
day50-1项目文件名 day50-1同名文件夹 #settings.py 项目配置文件 #urls.py 路由层 manage.py django入口文件 很多命令都需要该文件支持 db.sqlite3 django启动之后才会生成的文件 其实就是django自带的小型数据库 templates文件夹 模板层 app01应用文件夹 #migration文件夹 数据迁移记录(后续学习) #admin.py django自带的后台管理(后续学习) #apps.py 用于app的注册(后续学习) #models.py 专门用于操作数据库(后续学习 很重要) #views.py 视图层 ''' 创建应用之后 一定要去配置文件中注册才能生效 'app01.apps.App01Config' 完整语法 'app01' 简写语法 '''