一、Web前端与后端(PythonWeb)
1.Web前端:网页,包含HTML,CSS,JS。
静态网页:不能与服务器交互的网页
动态网页:能够与服务器交互的网页
2.Web后端:、Flask,Django、Ajax技术
二、服务器
1.服务器:为用户提供服务的计算机,将数据抽象成URL,以供用户访问。
2.组成:
硬件:主机
软件:能够处理用户请求的程序:Apache、Tomcat、IIS(InternetInformationService)、Nginx
3.作用:
存储Web相关的数据
处理请求和响应
具备安全性
三、框架
框架:为了解决一些开放性问题,重复性问题而产生的程序结构
框架模式:
MVC
M:模型层Model,与数据库打交道
V:视图层View
C:控制层Controller,处理请求与响应
MTV(Flask)
M:模型层Model
T:Template模板(HTML模板),
V:View视图层,处理请求与响应
四、Flask使用
1.Flask是一个基于Python并依赖于Jinja2模板引擎和WerkZeugWSGI服务的框架。
WSGI:WebServerGatewayInterface.Web服务网关接口,提供处理网络请求相关的功能
路由:为了匹配用户的请求地址,会自动执行视图函数,视图函数中必须有返回值,返回字符串显示到相应的页面中。
1、定义路由及视图函数
@app.route('/地址')
deffuncName():
return""#响应到页面中的内容
#视图函数
@app.route("/")
defindex():#匹配到路径后执行的视图函数
return"<h1>欢迎</h1>"
2、定义带参数的路由
变量:<变量名>
@app.route("/login/<name>/<age>")
deflogin(name,age):
return"%s,%s"%(name,age)
注意:路径中的参数变量永远是字符串类型
@app.route('/login/<name>/<age>')
deflogin(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>')
defcalcute(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')
defindex():
return"首页"
@app.route('/show')
@app.route('/show/list')
@app.route('/show/<name>')
defshow(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)从视图函数中获取相关的变量,传递到模板文件中。
returnrender_template("模板文件",key1=value1,key2=value2)
函数中可以传递若干键值对,其中的key名就是在模板文件中使用的变量名
视图函数中定义变量name=""、age=、dic=、tub、list将数据传递到模板文件中显示
defshow():
name="xb"
returnrender_remplate("",uname=name)
模板文件中使用{{uname}}
#模板
@app.route('/info')
definfo():
#返回模板文件,可以传递变量
#render_template("")返回模板字符串
print("%s",render_template("01-show.html"))
#returnrender_template("000.html")
#returnrender_template("001.html",uname=name,list=list)
returnrender_template("01-show.html",name="flask",age=20)
01-show.html
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>模板</h1>
<h1>{{uname,list[0]}}}</h1>
</body>
</html>
最后把代码汇总一下
fromflaskimportFlask,render_template
app=Flask(__name__)#创建Flask的程序实例
#视图函数
@app.route("/")
defindex():#匹配到路径后执行的视图函数
return"<h1>欢迎</h1>"
@app.route('/login/<name>/<age>')
deflogin(name,age):
return"<h1>欢迎登录,%s,%s</h1>"%(name,age)
@app.route('/calcute/<int:n1>/<int:n2>')
defcalcute(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>')
defshow(name="ze"):
return"show%s"%name
#模板
@app.route('/info')
definfo():
#返回模板文件,可以传递变量
returnrender_template("01-show.html",name="flask",age=20)
if__name__=="__main__":
app.run(debug=True)
3)、使用locals()返回字典,包含所有局部变量
returnrender_template("003.html",params=locals())
params=locals()
#{
#'tup':('ZX','DB'),
#'name':'老Q',
#'dic':{'age':30,'name':'Maria'},'list':['保健','唱K'],
#'age':30
#
#}
模板文件local.html
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="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="helloworld"
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>
{%foruserinparams.info%}
<h3
{%ifloop.firsh%}
class="c1"
{%elifloop.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%}
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h56372.shtml