Flask框架
2019-08-14 09:45:50来源:博客园 阅读 ()
一、Web前端与后端(Python Web)
1.Web前端:网页,包含HTML,CSS,JS。
静态网页:不能与服务器交互的网页
动态网页:能够与服务器交互的网页
2.Web后端:、Flask,Django、Ajax技术
二、服务器
1.服务器:为用户提供服务的计算机,将数据抽象成URL,以供用户访问。
2.组成:
- 硬件:主机
- 软件:能够处理用户请求的程序:Apache、Tomcat、IIS (Internet Information Service)、Nginx
3.作用:
- 存储Web相关的数据
- 处理请求和响应
- 具备安全性
三、框架
框架:为了解决一些开放性问题,重复性问题而产生的程序结构
框架模式:
MVC
- M:模型层Model,与数据库打交道
- V:视图层View
- C:控制层Controller,处理请求与响应
MTV(Flask)
- M:模型层Model
- T:Template模板(HTML模板),
- V:View视图层,处理请求与响应
四、Flask使用
1.Flask是一个基于Python并依赖于Jinja2模板引擎和WerkZeug WSGI服务的框架。
WSGI:Web Server Gateway Interface.Web服务网关接口,提供处理网络请求相关的功能
路由:为了匹配用户的请求地址,会自动执行视图函数,视图函数中必须有返回值,返回字符串显示到相应的页面中。
1、定义路由及视图函数
@app.route('/地址')
def funcName():
return "" #响应到页面中的内容
# 视图函数 @app.route("/") def index(): # 匹配到路径后执行的视图函数 return "<h1>欢迎</h1>"
2、定义带参数的路由
变量:<变量名>
@app.route("/login/<name>/<age>")
def login(name,age):
return "%s,%s" % (name,age)
注意:路径中的参数变量永远是字符串类型
@app.route('/login/<name>/<age>') def login(name, age): return "<h1>欢迎登录,%s,%s</h1>" % (name, age)
3、类型转换器
缺省 字符串,不能包含'/'
int: 转换整数
float: 转换小数
path: 字符串,允许包含'/'
使用:
@app.route('/show/<int:num>')
@app.route('/calcute/<int:n1>/<int:n2>') def calcute(n1,n2): # n1 = int(n1) # n2 = int(n2) n3 = n1 + n2 return "%d + %d = %d" %(n1,n2,n3)
4、多个URL执行同一个视图函数
@app.route('/')
@app.route('/index')
def index():
return "首页"
@app.route('/show') @app.route('/show/list') @app.route('/show/<name>') def show(name="ze"): return "show %s" % name
注意:
如果在app.run()设置host="0.0.0.0";不影响当前虚拟IP(127.0.0.1);可以让当前局域网中其他的计算机,通过内网IP访问服务器
模板
模板是一种特殊的HTML文件,Python+html网页结构,允许在HTML文件中定义变量,定义流程控制。使用模板可以使视图函数专注于处理业务逻辑,将页面渲染交由模板控制。
2.使用
- 导入 render_template
- 在视图函数中使用render_template("模板文件"),生成模板字符串,交由浏览器解析
- 所有的模板文件必须存在名为"templates"的文件下
变量代码块
1)模板中使用变量,语法{{ 变量名(key) }}
2)从视图函数中获取相关的变量,传递到模板文件中。
return render_template("模板文件",key1=value1,key2=value2)
函数中可以传递若干键值对,其中的key名就是在模板文件中使用的变量名
视图函数中定义变量 name=""、age=、dic=、tub、list 将数据传递到模板文件中显示
def show():
name="xb"
return render_remplate("",uname=name)
模板文件中使用 {{ uname }}
# 模板 @app.route('/info') def info(): # 返回模板文件,可以传递变量 # render_template("") 返回模板字符串 print("%s", render_template("01-show.html")) # return render_template("000.html") # return render_template("001.html", uname=name, list=list) return render_template("01-show.html", name="flask", age=20)
01-show.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>模板</h1> <h1>{{uname, list[0]}}}</h1> </body> </html>
最后把代码汇总一下
from flask import Flask, render_template app = Flask(__name__) # 创建Flask的程序实例 # 视图函数 @app.route("/") def index(): # 匹配到路径后执行的视图函数 return "<h1>欢迎</h1>" @app.route('/login/<name>/<age>') def login(name, age): return "<h1>欢迎登录,%s,%s</h1>" % (name, age) @app.route('/calcute/<int:n1>/<int:n2>') def calcute(n1,n2): # n1 = int(n1) # n2 = int(n2) n3 = n1 + n2 return "%d + %d = %d" %(n1,n2,n3) @app.route('/show') @app.route('/show/list') @app.route('/show/<name>') def show(name="ze"): return "show %s" % name # 模板 @app.route('/info') def info(): # 返回模板文件,可以传递变量 return render_template("01-show.html", name="flask", age=20) if __name__ == "__main__": app.run(debug=True)
3)、使用locals()返回字典,包含所有局部变量
return render_template("003.html", params=locals())
params = locals() # { # 'tup': ('ZX', 'DB'), # 'name': '老Q', # 'dic': {'age': 30, 'name': 'Maria'}, 'list': ['保健', '唱K'], # 'age': 30 # # }
模板文件 local.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>{{ params["name"] }}</h1> <h1>列表,元组和字典都可以使用[key/index]和点语法访问</h1> <h1>{{ params.name }}</h1> <h1>小泽{{ params.dic.name }}</h1> <h1>爱好:{{ params.list[0] }}</h1> <h1>爱好:{{ params.list.0 }}</h1> <h1>数据库:{{ params.tup[1] }}</h1> <h1>数据库:{{ params.tup.1 }}</h1> <h1>宠物名:{{ params.cat.name }}</h1> <h1>{{ params.cat.play() }}</h1> </body> </html>
4)、过滤器
允许模板中的变量在输出之前修改成其他的值,修改显示分类:
upper 转大写字母 lower 转小写字母
title 首字母大写 first 获取列表中第一个
last 获取最后一个 length 获取列表长度
default() 如果变量未赋值,可采用默认值 trim 去掉字符串两端的空格
语法: {{ 变量|过滤器1|过滤器2 }}
# python中的语言 list = ["保健", "唱K"] s1 = "hello world" s2 = " hello "
模板文件 local.html
<h1>过滤器</h1> <h2>upper:{{ params.s1|upper }}</h2> <h2>title:{{ params.s1|title }}</h2> <h2>参考:{{ params.s2 }}</h2> <h2>参考:{{ params.s2|trim }}</h2> <h2>first:{{ params.list|first }}</h2> <h2>length:{{ params.list|length }}</h2> <p> 在模板中使用变量,如果视图函数中未传递相应的值, 可以使用default过滤器设置变量默认的值 </p> <h2>default_test:{{ params.test|default("test") }}</h2>
4、控制代码块
在模板文件中书写条件语句和循环语句,使用: {% %}
if语句
{% if 条件 %}
条件成立时执行,允许书写静态标签,也可以书写变量
{% endif %}
if-else语句:
{% if 条件 %}
条件成立时执行
{% else %}
条件不成立时执行
{% endif %}
多重分支语句
{% if 条件1 %}
{% elif 条件2 %}
..
{% else %}
{% endif %}
for语句
{% for 变量 in 可迭代元素 %}
{% endfor %}
[{"name":"", "age":30}, {"name":"", "age":30}, {"name":"", "age":30},]
循环的内部变量:loop
直接在循环内部使用,表示本次循环相关的信息
loop.index:表示当前循环的次数,默认从1开始计
loop.index0:表示当前循环的次数,从0开始计
loop.first:表示是否为第一次循环,值为true表示第一次循环
loop.last:表示是否为最后一个循环
<p>for循环</p> {% for user in params.info %} <h3 {% if loop.firsh %} class="c1" {% elif loop.last %} class="c2" {% else %} class="c3" {% endif %} >姓名:{{ user.name }},年龄:{{ user.age }}</h3> {% endfor %}
5、静态文件
不与服务器交互的文件都是静态文件(css,js,图片,音视频等),所有的静态文件都必须存储在一个名为"static"的文件夹下,Flask程序会自动查找,
静态文件的访问:必须使用"/static/子路径"访问
url_for("视图函数名")实现反向解析路由:根据指定的视图函数返回对应的地址
使用:
根据视图函数解析对应的URL
# url_for("login") # "/login"
反向解析带参数的路由,函数中接收多个参数
# url_for("login",uname="Maria",upwd="123")) # "/login/Maria/123"
自动生成静态文件的路径
# "/static/css/base.css" href="{{ url_for('static',filename="css/base.css")}}">
练习:
创建新的项目,名称Blog
手动创建"templates"和"static"文件夹
将博客项目中的html文件复制到templates中,
所有的静态文件复制到static中
注册路由,访问首页和列表页
处理静态文件的访问路径(ctrl+F,ctrl+R)
6、模板的继承
(与类的继承相似)如果两个页面中大部分内容与结构都一致,可以采用模板继承
- 父模板:指定可以被子模板重写的内容
{% block 块名 %}
<h1>父模板</h1>
{% endblock %}
- 子模板中继承父模板
{% extends "父模板名称"%}
- 子模板中可以重写父模板中指定块的内容
{% block 块名 %}
<h1>子模板</h1>
{% endblock %}
原文链接:https://www.cnblogs.com/LXP-Never/p/11141837.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 合理使用CSS框架,加速UI设计进程 2020-04-16
- html框架iframe与frameset的介绍 2020-03-30
- Vue实例:vue2.0+ElementUI框架开发pc项目 2019-10-12
- HTML5开发常见的7个框架,你知道几个? 2019-09-17
- 解决使用elementUI框架el-upload跨域上传时session丢失问题 2019-08-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash