Flask框架

2019-08-14 09:45:50来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

一、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.使用

  1. 导入 render_template
  2. 在视图函数中使用render_template("模板文件"),生成模板字符串,交由浏览器解析
  3. 所有的模板文件必须存在名为"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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:HTML基本代码

下一篇:简单后台管理系统框架--HTML练手项目2【Frameset】