前端——>数据库
前端---->后端---->数据库数据库---->后端---->前端前端接受的信息通过后端传输给数据库,数据库的返回结果经过前端处理返回给前端
软件开发架构
cs架构 客户端/服务器架构bs架构 浏览器/服务器架构#本质bs也是cs
web框架的简短概念
可以将web框架理解成服务端
自定义简易版本的web框架
网络协议HTTP协议 数据传输是明文HTTPS协议 数据传输是密文websocket协议 数据传输是密文四大特性1.基于请求响应2.基于TCP、IP作用于应用层之上的协议3.无状态4.短/无链接数据格式请求首行请求头请求体响应状态码1XX2XX 2003XX4XX 403 4045XX 500"""# 如何做到后缀的不同返回不同的内容# 拿到用户输入的后缀 做判断# 不足之处1.代码重复(服务端代码所有人都要重复写)2.手动处理http格式的数据 并且只能拿到url后缀 其他数据获取繁琐(数据格式一样处理的代码其实也大致一样 重复写)3.并发的问题
流程分析
socket服务端建立起来以后访问--->获得客户端发送过来的信息--->将数据编译成utf8形式--->获得请求头-->(打上HTTP/1.1 200 OK)进行if判断并且返回相应结果--->返回给客户端
代码
# 你可以将web框架理解成服务端import socketserver = socket.socket() # TCP 三次握手四次挥手 osi七层server.bind(('127.0.0.1',8080)) # IP协议 以太网协议 arp协议...server.listen(5) # 池 ..."""b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8082\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nSec-Fetch-Site: none\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-User: ?1\r\nSec-Fetch-Dest: document\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: csrftoken=KYJnVBLPpJxwt09TOmTXzpb5qkFJwHVxVGpi0NxEGIg4z5VUuazZ1O2RMwSisu14\r\n\r\n'"""while True:conn, addr = server.accept()data = conn.recv(1024)# print(data) # 二进制数据data = data.decode('utf-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'templates/01 myhtml.html', 'rb') as f:conn.send(f.read())elif current_path == '/login':conn.send(b'login')else:# 你直接忽略favicon.icoconn.send(b'hello web')conn.close()
借助于wsgiref模块
"""urls.py 路由与视图函数对应关系views.py 视图函数(后端业务逻辑)templates文件夹 专门用来存储html文件"""# 按照功能的不同拆分之后 后续添加功能只需要在urls.py书写对应关系然后取views.py书写业务逻辑即可
流程推导
基于wsgiref先获得请求头--->定义一个变量为空 for循环urls判断请求头内容对应不同事件--->判断是否有事件最后再返回客户端
流程代码
from wsgiref.simple_server import make_serverfrom urls import urlsfrom views import *def run(env, response):""":param env:请求相关的所有数据:param 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 = Nonefor url in urls: # url (),()if current_path == url[0]:# 将url对应的函数名赋值给funcfunc = url[1]break # 匹配到一个之后 应该立刻结束for循环# 判断func是否有值if func:res = func(env)else:res = error(env)return [res.encode('utf-8')]if __name__ == '__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() # 启动服务端
动静态网页
"""静态网页页面上的数据是直接写死的 万年不变动态网页数据是实时获取的eg:1.后端获取当前时间展示到html页面上2.数据是从数据库中获取的展示到html页面上"""# 动态网页制作import datetimedef get_time(env):current_time = datetime.datetime.now().strftime('%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('dwadasdsadsadasdas',current_time) # 在后端将html页面处理好之后再返回给前端return data# 将一个字典传递给html文件 并且可以在文件上方便快捷的操作字典数据from jinja2 import Templatedef get_dict(env):user_dic = {'username':'jason','age':18,'hobby':'read'}with open(r'templates/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_dictreturn res# 后端获取数据库中数据展示到前端页面
jinja2模板语法
pip3 install jinja2"""模版语法是在后端起作用的"""# 模版语法(非常贴近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%}
web框架流程图
"""wsgiref模块1.请求来的时候解析http格式的数据 封装成大字典2.响应走的时候给数据打包成符合http格式 再返回给浏览器基于wsgiref先获得请求头--->定义一个变量为空 for循环urls判断请求头内容对应不同事件--->判断是否有事件最后再返回客户端"""
python三大主流web框架
"""Django特点:大而全 自带的功能特别多缺点:有时候过于笨重flask特点:小而精 自带功能特别少第三方模块非常多缺点:比较依赖于第三方的开发者tornado特点:异步非阻塞 支持高并发甚至可以开发游戏服务器缺点:不会"""A:socket部分B:路由与视图函数对应关系(路由匹配)C:模版语法djangoA用的是别人的 wsgiref模块B用的是自己的C用的是自己的(没有jinja2好用 但是也很方便)flaskA用的是别人的 werkzeug(内部还是wsgiref模块)B自己写的C用的别人的(jinja2)tornadoA,B,C都是自己写的
django注意事项
# 如何让你的计算机能够正常的启动django项目1.计算机的名称不能有中文2.一个pycharm窗口只开一个项目3.项目里面所有的文件也尽量不要出现中文4.python解释器尽量使用3.4~3.6之间的版本(如果你的项目报错 你点击最后一个报错信息去源码中把逗号删掉)# django版本问题1.X 2.X 3.X(直接忽略)1.X和2.X本身差距也不大 我们讲解主要以1.X为例 会讲解2.X区别公司之前用的1.8 满满过渡到了1.11版本 有一些项目用的2.0# django安装pip3 install django==1.11.11如果已经安装了其他版本 无需自己卸载直接重新装 会自动卸载安装新的如果报错 看看是不是timeout 如果是 那么只是网速波动重新安装即可验证是否安装成功的方式1终端输入django-admin看看有没有反应
pyCharm安装Django:
django基本操作
命令行创建项目1.创建django项目 创建命令 django-admin startproject 项目名字(不能是中文)mysite'''切换到你想要创建的盘,再进行创建'''2.启动django项目 python3 manage.py runserver'''需要切换到对应项目目录内cd/mysite'''3.创建应用 python3 manage.py startapp app01'''Next, start your first app by running python manage.py startapp [app_label].应用名应该做到见名知意userorderweb...但是我们教学统一就用app01/02/03/04'''pyCharm创建项目1.创建Django项目 new project 选择左侧第二个django即可(建议使用2.2左右版本1.x真的太容易报错了)2.启动1.还是用命令行启动2.点击绿色小箭头即可3.创建应用1.pycharm提供的终端直接直接创建 python3.5 manage.py startapp app012.pycharmtoolsrun manage.pyappstart app02 -->这东西还有提示就离谱
应用
"""django是一款专门用来开发app的web框架django框架就类似于是一所大学(空壳子)app就类似于大学里面各个学院(具体功能的app)比如开发淘宝订单相关用户相关投诉相关创建不同的app对应不同的功能选课系统学生功能老师功能一个app就是一个独立的功能模块"""**********创建应用一定要去配置文件中注册INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01.apps.App01Config',#全写'app02'#简写]#创建出来的应用第一步就是先去配置文件中注册 其他的都先不要管在使用pycharm创建项目的时候 pycharm可以帮助你创建一个app并且注册 (个人觉得还是手动比较舒服)
主要文件介绍
-mysite项目文件夹--mysite文件夹--settings.py 配置文件--urls.py 路由与视图函数对应关系文件--wsgi.py wsgiref模块(不需要考虑)--manage.py django的入口文件--db.sqlite3 django自带的sqlite3数据库(小型数据库 功能不多且有bug)-app01文件夹--admin.py django后台管理--apps.py 注册使用--models.py 数据库相关 模型类(orm)--tests.py 测试文件--views.py 视图函数(视图层)
命令行创建与pycharm创建的区别
1.命令行创建不会自动创建template文件夹 需要自己动手创建而pycharm会自动帮你创建并且还会自动在配置文件中对应相应的路径pycharm创建TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [str.format(BASE_DIR, '/templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},]命令行创建TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},]所以在使用命令行创建django项目的时候不单单需创建template文件夹还需要配置文件配置路径'DIRS': [os.path.join(BASE_DIR, 'templates')]
django小白必会三板斧
from django.shortcuts import HttpResponse,render,redirectHttpResponse返回字符串类型的数据return HttpResponse('hello word')render返回html文件的return render(request,'dd.html') 显示不出来一般就是路径有问题,参考上面的区别即可redirect重定向return redirect('https://www.mzitu.com/')return redirect('/home/')--->相当于render
课后练习
"""1.整理web框架推导思路2.安装django并正常启动访问,测试三板斧3.整理今日日考题,django内容选做题1.结合前端,django,MySQL,pymysql模块实现数据库数据动态展示到前端2.尝试着摸索django模版语法"""
