目录
Flask 轻量级 WEB 框架
AJAX 阿贾克斯,在web中主要完成,异步的请求和响应
Django 重量级 WEB 框架
1.静态网页 与 动态网页
- 静态网页:无法与服务器进行交互的网页
- 动态网页:能够与服务器进行交互的网页
2.WEB 与 服务器
- WEB:网页(HTML,CSS,JS)
- 服务器
能够给用户提供服务的机器就是服务器- 硬件与软件
硬件范畴:一台主机
软件范畴:一个能够接收用户请求并给出响应的程序
1.APACHE
2.TOMCAT
3.IIS(Internet Information Service)
4.Nginx
... ... - 作用
- 存储WEB所需要的信息
- 能够处理用户的请求(request)并给出响应(response)
- 能够执行服务器端程序
- 具备一定的安全功能
- 硬件与软件
3.框架
- 什么是框架
框架是一个为了解决开放性问题而存在的一种结构。框架本身也提供了一些最基本的功能。我们只需要在基础功能上搭建属于自己的操作即可 - Python Web 框架
- flask
- django
- tornado
- webpy
... ...
web 重点,请求,响应,数据
4.Flask 框架
- 什么是Flask
Flask是一个基于Python并且依赖于Jinja2模块引擎和Werkzeug WSGI 服务的一个微型框架
WSGI:Web Server Gateway Interface(WEB服务网关接口) - Flask 的框架模式 - MTV
M:Models,模型层,负责数据库建模
T:Templates,模板层,用于处理用户显示的内容,如:html
V:Views,视图层,处理与用户交互的部分内容,处理用户的请求并给出响应
经典三层结构:MVC
M:Models,模层型,负责数据库建模
V:Views,视图层,用于处理用户显示的部分内容如:html
C:Controller,控制器,处理与用户交互的部分内容,处理用户的请求与响应
5.Flask实现
- 安装flask
sudo pip3 install flask
查看已安装的flask版本,在python的交互模式中
import flask
flask.__version__
flask官网:http://flask.pocoo.org/ - 初始化
from flask import Flask # 将当前运行得到主程序构建成Flask的应用,以便接收用户的请求(request),并给出响应(response) app = Flask(__name__) #@app.route() Flask中的路由定义,定义用户的访问路径, / 表示的是整个网站的根路径 #def index(),表示匹配上@app.route()路径后的处理程序-视图函数,该类函数必须要有return,return后要给一个字符串 或 响应对象 @app.route('/') def index(): return "<h1>this is my first flask app</h1>" if __name__ == '__main__': # 运行Flask应用(启动Flask的服务),默认在本机开启的端口号是5000,debug=True,是将当前的启动模式改为调试模式(开发环境中推荐使用调试模式,生产环境中不允许使用) app.run(debug=True)
访问路径:http://localhost:5000/login:显示‘登录页面’
访问路径:http://localhost:5000/register:显示‘注册页面’
详情见下面示例 ↓
6.Flask - 路由(route)
- 什么是路由
客户端将请求发送给web服务器,web服务器再将请求发送给flask程序实例
程序实例需要知道每个url请求要运行哪些代码,所以需要建立一个url 到 python 函数的映射,处理url和函数之间的关系的程序就是 路由
在Flask中,路由是通过 @app.route 装饰器来表示的 - 路由的体现
- 路由的基本表示
@app.route('/')
def index():
return 'xxx'
@app.route('/login')
def login():
return 'xxx' - 带参数的路由
http://localhost:5000/show/sf.zh
http://localhost:5000/show/wuji.zh
http://localhost:5000?show/zhouzhiruo- 基本带参路由
@app.route('/show/<name>')
def show1(name):
在函数中 name 表示的就是地址栏上传递过来的数据
return 'xxx' - 带多个参数路由
localhost:5000?show2/sf.zh/85
localhost:5000?show2/wj.zh/18
localhost:5000?show2/ss.yin/30
@app.route('/show2/<name>/<age>')
def show2(name,age):
return 'xxx' - 指定参数类型的路由
@app.route('/show3/<name>/<int:age>')
def show3(name,age):
return:'xxx'
<int:age>:表示age参数时一个整型的数值而并非默认的字符串
int:类型转换器
Flask 中所支持的类型转换器:类型转换器 作用 缺省 字符串型,但不能有/(斜杠) int: 整型 float: 浮点型 path: 字符串型,可以有/(斜杠)
- 基本带参路由
- 多URL 的路由匹配
允许在一个视图处理函数中设置多个url路由器则
@app.route('/')
@app.route('/index')
def index():
return 'xxx' - 路由中设置 HTTP 请求方法
Flask路由规则也允许设置对应的请求方法,只有将匹配上请求方法的路径交给视图处理函数去执行
@app.route('/post',methods=['POST'])
def post():
return 'xxx'
说明:只有post请求方式允许访问, localhost:5000/post - URL的反向解析
正向解析:程序自动解析,根据@app.route()中的访问路径来匹配处理函数
反向解析:通过视图处理函数的名称自动生成视图处理函数的访问路径
Flask 中提供了 url_for() 函数,用于反向解析 url
第一个参数:指向函数名(通过@app.route()修饰函数)
后续的参数们:对应要构建的url上的变量
ex:
@app.route('/')
def index():
return 'Index'
@app.route('/show/<name>')
def show(name):
return 'name:%s' %name
1.url_for('index') : 结果为:/
2.url_for('show',name='zsf') : 结果为:./show/zsf/
特殊:
url_for('static',filename='style.css')
静态文件反向解析,后续使用,讲解from flask import Flask, url_for app = Flask(__name__) # @app.route('/') # def index(): # return '这是首页' @app.route('/login') def login(): return '这是登录页面' @app.route('/register') def register(): return '这是注册页面' # 定义带一个参数的路由 @app.route('/show1/<name>') def show1(name): return "<h1>姓名为:%s</h1>" % name # 定义带两个参数的路由 @app.route('/show2/<name>/<age>') def show2(name,age): return "<h1>姓名为:%s,年龄为:%s" % (name,age) # 定义带两个参数的路由,其中,age参数指定为整数 @app.route('/show3/<name>/<int:age>') def show3(name,age): # age : 为 整型,并非 字符串 return "传递进来的参数是name:%s,age:%d" % (name,age) # 多 URL 路由匹配 @app.route('/') @app.route('/index') @app.route('/<int:page>') @app.route('/index/<int:page>') def index(page=None): if page is None: page = 1 return "当前页数为:%d" % page @app.route('/post',methods=['POST','GET']) def post(): return '这是post请求方式进来的' @app.route('/url') def url_views(): # 将 login() 反向解析访问地址 # logUrl = url_for('login') # print(logUrl) # # resp = "<a href='"+logUrl+"'>我要登录</a>" # return resp # 将 show2(name,age) 反向解析访问地址 url = url_for('show2',name='sf.zh',age=85) print(url) resp = "<a href='"+url+"'>"+url+"</a>" return resp if __name__ == "__main__": app.run(debug=True)
- 路由的基本表示
7.模板 - Templates
- 什么是模板
模板是一个包含响应文本的文件(通常是html文件),该文件中允许包含‘占位变量’来表示动态的内容,其具体值在请求中才能知道,‘占位变量’最终会被真实的值所替换。
模板最终也会被解析成响应的字符串,这一过程被称为‘渲染’
Flask实际上是使用Jinja2 强大的模板引擎 - 模板的设置
默认的情况下,Flask会在程序文件夹中的templates 子文件夹寻找模板
需要手动创建 templates 文件夹 - 渲染模板
在 视图函数中,通过
return render_template() 将模板渲染成字符串再响应给客户端
render_template() 语法:
render_template('xxx.html',arg1=value1,arg2=value2)
参数1:xxx.html,要渲染给客户端的html模板文件,
参数 ~n:要传递给模板动态显示的变量占位符,如果没有动态的变量占位符,则可以省略
返回值:字符串from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): str = render_template('index.html') print(str) return str if __name__ == '__main__': app.run(debug=True,port=5555)
随便一个html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>中国</title> <style> .container{ width:90%; margin:0 auto; } .container .title{ background-color:#f60; } </style> </head> <body> <div class="container"> <div class="title"> 我的第一个模板 </div> <div class="main"> 主要内容 </div> <div> 中国,是以华夏文明为源泉、中华文化为基础,并以汉族为主体民族的多民族国家,通用汉语、汉字,汉族与少数民族被统称为“中华民族”,又自称为炎黄子孙、龙的传人 </div> </div> </body> </html>