Flask框架(一)

一 什么是Flask

  1. Flask框架
    Flask 是一个 web 框架。也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序。这个 wdb 应用程序可以使一些 web 页面、博客、wiki、基于 web 的日历应用或商业网站。
    Flask 属于微框架(micro-framework)这一类别,微架构通常是很小的不依赖于外部库的框架。这既有优点也有缺点,优点是框架很轻量,更新时依赖少,并且专注安全方面的 bug,缺点是,你不得不自己做更多的工作,或通过添加插件增加自己的依赖列表。
  2. Flask框架的依赖性
    Flask 的依赖如下:
    1). Werkzeug 一个 WSGI 工具包
    Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口)。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口
    2). jinja2 模板引擎
    使用模板你可以设置你的页面的基本布局,并提及哪个元素将发生变化。这种方式可以定义您的网页头部并在您的网站的所有页面使它保持一致,如果你需要改变网页头部,你只需要更新一个地方。
    使用模板引擎创建/更新/维护你的应用会节约你很多时间

二 Flask框架的基本结构

  1. 首先导入Flask类
from flask import  Flask
  1. 实例化一个Flask对象
app = Flask(__name__)

其中:__name__是模块的名称或者包的名称
作用:根据这个参数确定flask应用的路径, 从而快速查找模板和html文件的默认路径
模块就是python文件; 包就是目录(跟普通目录多加一个__init __. py)

  1. 设置基本路由:通过路由绑定一个视图函数
@app.route('/')
def index():
    return  "

hello world

"

其中: @app.route(’/’): 告诉Flask哪个URL才能出发对应的函数, 又称为路由
对应定义了一个视图函数, 也就是返回给用户浏览器显示的内容

  1. 运行Flask应用, 可以指定ip和端口
app.run()

当然也可以指定IP和端口
让指定的IP号访问:

app.run('172.25.254.69',9000)

也可以让本机所有的IP号访问:

app.run('0.0.0.0',9000)
  1. 结合在一起,就是Flask最基本的框架
from flask import Flask

fla=Flask(__name__)


@fla.route('/')
def index():
    return 'hello'

fla.run()

运行结果:
Flask框架(一)_第1张图片

三 路由与变量规则

常见路由规则:
1). url的一部分可以标记为变量<变量名>
2). flask中路由里面的变量常见类型:int,string,float,path,uuid

from flask import Flask

fla=Flask(__name__)

@fla.route('//comments/')
def index(id):
    return '%s index' %(id)

@fla.route('/welcome//')
def welcome(user):
    return 'welcome %s' %(user)

fla.run()

执行结果:
Flask框架(一)_第2张图片
Flask框架(一)_第3张图片
指定输入的形式,是字符串,是整形,还是其它

四 URL构建与反向URL

from flask import Flask, request, url_for

app = Flask(__name__)


@app.route('/welcome//')
def welcome(user):
    return user + "用户, 欢迎来到westos"


@app.route('/path/')
def path():
    print(request.headers)
    print(request.method)
    # url_for: 根据函数名, 反向生成url地址
    print("用户正在访问url地址:%s" % (url_for(endpoint="welcome", user="westos")))
    return "用户正在访问url地址:%s" % (url_for(endpoint="welcome", user="westos"))
app.run()

执行结果:
Flask框架(一)_第4张图片
构建新的URL,访问该URL获得信息
Flask框架(一)_第5张图片
注意:
1).通过 url_for ,根据函数名,反向构建URL
2).通过 request类,可以得到其头部信息或者访问模式,是 get 或者 post ,等

五 Flask框架的一些问题
前面写过一个简单的HTML页面:
包括(主页,登陆页和注册页)
Flask框架(一)_第6张图片
Flask框架(一)_第7张图片
Flask框架(一)_第8张图片
现在通过Flask框架对其进行编辑,让代码更加的简短,让客户端提交的数据到达后台,进行数据处理
简单的判断:
1).用户登陆时的用户名与密码(看其用户名是否是root,密码是否是westos)
2).html页面的异常处理(弹出404报错页面)

from flask import Flask, request, render_template, redirect, url_for, abort

fla=Flask(__name__)

@fla.route('/')
def index():
    return render_template('index.html')

@fla.route('/login/',methods=['GET','POST'])
def login():
    if request.method == 'POST':
        user=request.form['user']
        passwd=request.form['passwd']
        if user == 'root' and passwd == 'westos':
            return redirect(url_for('index'))
        else:
            return render_template('login.html',message='用户名或者密码错误')
    else:
        return render_template('login.html')

@fla.errorhandler(404)
def not_found(e):
    return render_template('404.html')

@fla.route('/user/')
def user(user_id):
    if 0

需要注意的点:

  1. 常见的HTTP请求方法:
    GET:
    1). 获取信息
    2). 提交的信息会展示在url: http://www.wewtos.org/login?user=westos&passwd=westos
    POST:
    1). 提交信息
    2). 不在url里面展示, 有利于数据的安全性
  2. 默认路由接受的请求方法?
    默认路由的接受请求方法为:__ get __
    如何指定接收多个HTTP请求方法?
@app.route('/login/', methods=['GET', 'POST'])
  1. request类的一些用法
    如何判断用户请求的HTTP方法?
request.method()

如何获取用户POST请求提交的表单数据?

request.form()
  1. 模版渲染
    Flask自带的模版引擎:jinjia2
    在html文件中,通过动态赋值 , 将重新翻译好的html文件(模板引擎生效) 返回给用户的过程
    python的Web开发中, 业务逻辑(实质就是视图函数的内容)和页面逻辑(html文件)分开的, 使得代码的可读性增强, 代码容易理解和维护
    Flask框架(一)_第9张图片
    python中生成html不易修改与维护, 所以将html的内容独立到templates目录中
    1).去当前项目目录下寻找templtes是否存在?再去判断templates目录下是否有login.html文件?
    2). 读取这个login.html文件的内容, 作为render_template的返回值;
    3). 最终返回给用户浏览器:render_template('login.html')

  2. 重定向和错误提示
    1).运用redirect重新定向 html页面
    运用render_template重新渲染html页面
    2).错误提示:

render_template('login.html', message="用户名或者密码错误")

运用 jinjia2 通过后台向前台提示信息,信息内容为 message="用户名或者密码错误"

  1. 404报错处理
    当访问页面错误时,通过@app.errorhandler(404)自定义404错误
    再通过重定向访问404专属页面

六 变量的显示
通过 jinjia2 的变量规则来显示一些变量
包含(字符串、列表、字典和类)

from flask import Flask,render_template

fla=Flask(__name__)

class User(object):
    def __init__(self,name,passwd):
        self.name=name
        self.passwd=passwd
    def __str__(self):
        return 'User : %s' %(self.name)
@fla.route('/')
def muban():
    name='hello world'
    li=[1,2,3,4]
    d=dict(a=1,b=2)
    u=User('westos','passwd')
    return render_template('hello.html',
                           name=name,
                           li=li,
                           d=d,
                           u=u
                           )
fla.run()

hello.html 页面内容:




    
    Title


变量:{{name}}

列表:{{li}} {% for i in li %}
列表元素显示:{{i}} {% endfor %}
字典:{{d}}
字典元素显示:{{d.a}}
字典元素显示:{{d['b']}}
对象:{{u}}
用户名 密码
{{u.name}} {{u.passwd}}

执行结果:
Flask框架(一)_第10张图片

七 过滤器与自定义过滤器

  1. 基本的过滤器
from flask import Flask,render_template

fla=Flask(__name__)

class User(object):
    def __init__(self,name,passwd):
        self.name=name
        self.passwd=passwd
    def __str__(self):
        return 'User : %s' %(self.name)
@fla.route('/')
def filtration():
    name='hello world'
    li=[1,2,3,4]
    d=dict(a=1,b=2)
    dDict=[
        {'count':100,'price':20},
        {'count':50,'price':30}
    ]
    u=User('westos','passwd')

    return render_template('filtration.html',
                           name=name,
                           li=li,
                           d=d,
                           u=u,
                           dDict=dDict,     
                           )
fla.run()

filtratio.html 页面:




    
    Title


字符串

  • {{name | upper}}
  • {{name | lower}}
  • {{'hello' | capitalize}}
  • {{name | reverse}}

数值

  • {{li}}
  • {{li | first}}
  • {{li | last}}
  • {{li | length}}
  • {{li | sum}}
  • {{li | sort}}
  • {{li | reverse}}
  • {{li | join(':')}}

执行结果:
Flask框架(一)_第11张图片

  1. 自定义时间过滤器
import time
from flask import Flask,render_template

fla=Flask(__name__)

# @fla.add_template_filter
def format_date(value,format='%Y-%m-%d %H:%M:%S'):
    ttime=time.localtime(value)
    return time.strftime('%Y-%m-%d %H:%M:%S',ttime)
fla.add_template_filter(format_date,'format_date')   #两个方法都可以

@fla.route('/')
def filtration():
    now_time=time.time()
    return render_template('filtration.html',
                           now_time=now_time
                           )
fla.run()

filtration.html 页面:




    
    Title



{{now_time}}

{{now_time | format_date}}

执行结果:
Flask框架(一)_第12张图片
通过自定义过滤器将时间戳转变为想要格式的时间

八 模版的继承

  1. 如何继承某个模版
{% extends "模板名称" %}
  1. 如何挖坑和填坑
    挖坑:
 {% block 名称 %}
     默认值
 {% endblock %}

填坑:

{% block 名称 %}
   代码内容
{% endblock %}
  1. 如何调用/继承被替代的模板
    挖坑:
{% block 名称 %}
     默认值
{% endblock %}

挖坑:

{% block 名称 %}
#如何继承挖坑时的默认值?
{{ super() }}
# 后面写新加的方法.
........
{% endblock %}

九 宏macro的使用
定义marco.html

{% macro 函数名(变量)%}
html代码样(包含需要替换的变量)
{% endmacro %}

可以改写包含此宏的html

十 Flask的初步应用
修改上面的页面,分为(主函数:py文件、static:静态目录(放置css样式,js和字体样式等)、templates(放置html文件))

tempaltes目录下的html文件:

  1. 模版:base.html



    
    {% block title %} {% endblock %}西部开源
    
    
    






{% block connent %}

{% endblock %}


    




  1. macro页:macro.html
{% macro input(text,name,type) %}
{% endmacro %}
  1. 报错页:404.html



    
    Title



404:页面找不到

  1. 首页:index.html
{% extends 'base.html' %}

{% block title %}
首业
{% endblock %}

{% block connent %}

新闻名称

西部开源. 25K评论. 7分钟前

新闻名称

西部开源. 25K评论. 7分钟前

新闻名称

西部开源. 25K评论. 7分钟前

新闻名称

西部开源. 25K评论. 7分钟前
{% endblock %}
  1. 登陆页:login.html
{% extends 'base.html' %}
{% block title %}
登陆
{% endblock %}
{% block connent %}
  

登录 没有账号?注册

{% import 'macro.html' as macro %} {{macro.input('用户名/手机/邮箱','user','text')}} {{macro.input('密码','passwd','password')}}
{% if message %}

{{message}}

{% endif %}
{% endblock %}

主函数:run.py

from flask import Flask, request, render_template, redirect, url_for, abort

fla=Flask(__name__)

@fla.route('/')
def index():
    return render_template('index.html')

@fla.route('/login/',methods=['GET','POST'])
def login():
    if request.method == 'POST':
        user=request.form['user']
        passwd=request.form['passwd']
        if user == 'root' and passwd == 'westos':
            return redirect(url_for('index'))
        else:
            return render_template('login.html',message='用户名或者密码错误')
    else:
        return render_template('login.html')

@fla.route('/signup/',methods=['GET','POST'])
def signup():
    if request.method == 'POST':
        tel=request.form['tel']
        yanzheng=request.form['yanzheng']
        mima=request.form['mima']
        if tel == '123' and yanzheng == '456' and mima == '789':
            return '注册成功'
        else:
            return '注册失败'
    else:
        return render_template('signup.html')

@fla.errorhandler(404)
def not_found(e):
    return render_template('404.html')

@fla.route('/user/')
def user(user_id):
    if 0

你可能感兴趣的:(Flask框架(一))