一. 基本概念
1. WEB 服务器端 框架种类
1. Flask -- 轻量级WEB框架
2. AJAX -- 异步的技术体现
3. Django -- 重量级WEB框架
2. 静态网页 与 动态网页
1. 静态网页: 无法与服务器做动态数据交互的网页是静态网页
2. 动态网页: 允许与服务器做动态数据交互的网页是动态网页
3. WEB 与 服务器
1. 什么是WEB web即网页
2. 服务器 - Server
1. 什么是服务器
能够给用户提供服务的机器就是服务器,用户群体非常大
2. 所需 硬件 与 软件 条件
1. 硬件 一台主机
2. 软件
一个能够接受用户请求并给出响应的程序
常用的服务器端软件:
1. APACHE APACHE软件基金会
2. TOMCAT
3. IIS - Internet Information Service 微软
4. Nginx
3. 作用
1. 存储web上的信息
2. 能够处理用户的请求(request)并给出响应(response)
3. 执行服务器端的处理程序
4. 具备基本的安全功能(计算机服务器安全性漏洞)
4. 框架
1. 什么是框架
框架是一个为了解决开放性问题而存在的程序结构(基础只有一个: 面向对象(需牢牢掌握))
2. Python Web 框架
1. Flask - 轻量级框架(辅助第三方功能多)
2. Webpy - 轻量级框架
3. Tornado - 异步框架
4. Django - 重量级框架(自带功能/库多,强大后台管理)
3. 框架模式
1. 框架模式
框架中各部分组件的交互方式
2. 常用模式
1. MTV
M: Models,模型层(只跟数据库打交道)
T: Templates,模板层,html
V: Views,视图层,与用户打交道(请求和响应)
2. MVC
M: Models,模型层,与数据库交互
V: Views,视图层,html
C: Controller,控制器,与用户打交道(请求和响应)
M -- M
T -- V
V -- C
二. Flask安装
1. 什么是Flask
Flask是一个基于Python并且依赖于Jinja2模板引擎和WerkzeugWSGI服务的微型框架(Micro Framework)
WSGI: Web Server Gateway Interface (WEB服务网关接口)
Flask自带测试服务器
----- 翻译 -----
| | <--WSGI---> | |
| 日 | | 美 |
----- -----
2. 安装
1. 查看已安装版本
进入到python交互模式
>>> import flask
没反应: 导入成功,说明当前解释器有flask
报错: 当前解释器下没有flask需独立安装
2. 安装flask
sudo pip3 install flask
快捷键: alt + 1 隐藏工程目录
三. Flask-路由(route)
1. 什么是路由
路由就是为了匹配用户的请求地址以及对应的视图函数
2. 路由的体现
在Flask中,路由通过 @app.route() 装饰器来表示的
示例:
1. http://localhost:5000
@app.route("/")
def index():
return "xxx"
2. http://localhost:5000/admin/login # 分析出来 "/" 表示哪一部分内容 http://localhost:5000/
@app.route("/admin/login") # 最前的 '/' 表示的网站根目录
def admin_login():
return "xxx"
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 from flask import Flask 2 # 将当前的运行的主程序构建成Flask应用,以便接收用户的请求和响应 3 app = Flask(__name__) 4 5 @app.route('/') 6 def first(): 7 return "<h1>这是我的网站的首页</h1>" 8 9 # @app.route(),是flask中的路由定义,主要是为了匹配用户的访问路径,‘/’表示的是整个网站的根(域名或ip地址) 10 # ‘index’表示的是自定义的访问路径(可以自由定义) 11 # index(): 表示的是匹配上路径之后的处理程序,视图处理函数(Views),视图处理函数中必须要有一个返回值 12 # 现在阶段必须要返回一个字符串,表示要响应给客户端浏览器的内容 13 @app.route('/index') 14 def index(): # 视图函数,访问必须有返回值 15 a = 3 16 b = 5 17 r = a + b 18 print(r) 19 return "This is my first flask demo!"
3. 带参数的路由
参数: 辅助函数进行运算,可表示动态的数据
http://localhost:5000/show/lvzemaria
http://localhost:5000/show/zhexuelv
路由中可以携带参数来表示要传递到视图中的数据 # 通过路由(地址栏)向视图函数传递参数,并做出处理
1. 基本的带参路由
@app.route("/地址/<参数名>") # 参数名为英文的
def xxxx(参数名):
"参数名"表示的就是地址栏中传递过来的参数
示例:
声明访问路径 /show/<参数>, 在视图中将参数值响应给客户端
@app.route("/show/<name>")
def show(name):
# name的数据类型??? # 若没有指定类型,无论输入什么,传入的都为字符串
return "传递进来的参数值为:"+name
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 @app.route("/show/<name>") 2 def show(name): 3 return "传递进来的参数值为:" + name
2. 带有多个参数的路由
@app.route("/路径/<参数1>/<参数2>")
def xxxx(参数1,参数2):
参数1: 表示的是第一个参数值
参数2: 表示的是第二个参数值
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 # 路由地址栏传参(多个参数) 2 @app.route('/show/<name>/<gender>') 3 def show(name,gender): 4 print("name的类型为:",type(name)) 5 print("gender的类型为:",type(gender)) 6 return "姓名:%s,性别:%s" % (name,gender)
示例:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 # 练习: 2 # 1.创建FlaskDemo01 - exer项目 3 # 2.创建run.py文件, 并搭建程序结构 4 # 3.声明一个路由 5 # http: // 127.0.0.1: 5000 / calc / 数字1 / 数字2 6 # 将地址栏中的两个数字的 + - * / % 的结果响应给浏览器http: // 127.0.0.1: 5000 / calc / 10 / 5 7 # 响应: 8 # 10 + 5 = 15 9 # 10 - 5 = 5 10 # 10 * 5 = 50 11 # 10 / 5 = 2 12 # 10 % 5 = 0 13 14 from flask import Flask 15 16 app = Flask(__name__) 17 18 @app.route('/calc/<num1>/<num2>') 19 def calc(num1,num2): 20 # 将num1,num2转换为数字 21 num1 = int(num1) 22 num2 = int(num2) 23 # 拼接响应输出的字符串 24 s = "<h1>%d+%d=%d</h1>" % (num1,num2,num1+num2) 25 s += "<h1>%d-%d=%d</h1>" % (num1,num2,num1-num2) 26 s += "<h1>%d*%d=%d</h1>" % (num1,num2,num1*num2) 27 s += "<h1>%d/%d=%d</h1>" % (num1,num2,num1/num2) 28 s += "<h1>%d%%%d=%d</h1>" % (num1,num2,num1%num2) 29 return s
3. 指定参数类型的路由
指定参数的类型(内部将数据类型给转换了)
@app.route("/show/<name>/<int:age>")
def show(name,age): # 一般传入参数,def定义的形参要一致
name : 字符串
age : 整数
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 @app.route('/calc/<int:num1>/<int:num2>') 2 def calc(num1,num2): 3 # 拼接响应输出的字符串 4 s = "<h1>%d+%d=%d</h1>" % (num1,num2,num1+num2) 5 s += "<h1>%d-%d=%d</h1>" % (num1,num2,num1-num2) 6 s += "<h1>%d*%d=%d</h1>" % (num1,num2,num1*num2) 7 s += "<h1>%d/%d=%d</h1>" % (num1,num2,num1/num2) 8 s += "<h1>%d%%%d=%d</h1>" % (num1,num2,num1%num2) 9 return s
int: 类型转换器
Flask中所支持的类型转换器:
类型转换器 作用
缺省 字符串,不能有斜杠(/) # 如果没有类型转换器,则默认为字符串
int: 整数
float: 浮点数
path: 字符串,允许有斜杠(/)
4. 多url的路由匹配
允许让多个url地址匹配到同一个视图处理函数
http://localhost:5000/
http://localhost:5000/index
http://localhost:5000/default
# 就相当于视图处理函数外层包了多个装饰器(url)
@app.route("/")
@app.route("/index")
@app.route("/default")
def index():
xxx xxxx
return "xxx"
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 # 练习: 2 # 当访问路径是以下任意一种的时候: 3 # localhost: 5000 / 4 # localhost: 5000 / index 5 # localhost: 5000 / 数字 6 # localhost: 5000 / index / 数字 7 # 响应给客户端的内容为: 8 # 如果路由中有数字传递的话 9 # 响应: 您当前要看的页数为第xx页 10 # 如果路由中没有数字传进来 11 # 响应: 您当前要看的页数为第1页 12 13 from flask import Flask 14 15 app = Flask(__name__) 16 17 @app.route('/') 18 @app.route('/<int:page>') 19 @app.route('/index') 20 @app.route('/index/<int:page>') 21 def index(page=1): 22 return "您当前要看的页数为第%d页" % page 23 24 if __name__ == "__main__": 25 app.run(debug=True)
5. URL的反向解析
正向解析:程序自动解析,根据@app.route()中的访问路径,来匹配处理函数
反向解析:通过视图处理函数的名称生成对应的访问路径
在Flask中实现反向解析:
from flask import url_for
语法:
url_for(funName[,args])
funName:要生成地址的函数名
args:地址中需要的参数,可选的
返回值:字符串,对应的访问地址