Flask框架一

Flask 属于微框架(micro-framework)这一类别,我们可以使用Python语言快速实现一个网站或Web服务。微架构通常是很小的不依赖于外部库的框架。这既有优点也有缺点,优点是框架很轻量,更新时依赖少,缺点是你不得不自己做更多的工作,或通过添加插件增加自己的依赖列表。flask默认的模板渲染引擎是janjia2

一 Flask基础绪论

1.安装flask

pip install flask

2.导入Flask类

from flask import Flask

3.实例化一个Flask对象

app = Flask(__name__)

__name__是模块的名称或者包的名称
作用: 根据这个参数确定flask应用的路径, 从而快速查找模板和html文件的默认路径;也可以说这里的app就是一个程序实例,客户端(一般是浏览器)将请求发送给服务端Web服务器,Web服务器再把请求发给Flask实例。

模块就是python文件; 包就是目录(跟普通目录多加一个__init__.py);

4.基本路由:通过路由绑定一个视图函数

程序实例需要知道所有url对应的执行代码,所以要有从url到python函数的映射关系。处理url到python函数映射关系的程序一般叫做路由(Router)。

@app.route('/')
def index():
    return '

hello world

' @app.route('/login/') def login(): return 'login'

@app.route(’/’): 告诉Flask哪个url才能出发对应的函数,又称为路由;对应定义了一个视图函数,也就是返回给用户浏览器显示的内容; 即路由所对应的程序称为视图函数(view function),即上面的index()函数

5.运行Flask应用,可以指定ip和端口

app.run()运行应用,启动服务器,可以指定ip和端口
‘0.0.0.0’ 所有的IP都可以访问到

app.run('0.0.0.0', 9000)

Flask框架一_第1张图片
Flask框架一_第2张图片

二 路由与变量规则

常见路由的规则:

1. url的一部分可以标记为变量<变量名>
2. flask中路由里面的变量常见类型:

 int, string, float, path, uuid
from flask import Flask

app=Flask(__name__)

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

@app.route('/welcome//')
def welcome(user):
    app.logger.debug('this is a debug')
    app.logger.warning('this is a warn')
    return user+'用户,欢迎来到XX商场'

app.run()

Flask框架一_第3张图片
在这里插入图片描述
在这里插入图片描述

三 URL构建与反向URL

from flask import Flask, request, url_for

app=Flask(__name__)

@app.route('/welcome/')
def welcome(user):
    return user +'用户,欢迎光临'

@app.route('/path/')
def path():
    print(request.headers)

    #查看默认url地址的请求方法
    print(request.method)
    #url_for:根据函数名,反向生成url地址
    print('用户正在访问url地址:%s' %(url_for(endpoint='welcome',user='Merry')))
    return '用户正在访问url地址:%s' %(url_for(endpoint='welcome',user='Merry'))
app.run()

Flask框架一_第4张图片
在这里插入图片描述
Flask框架一_第5张图片
通过 request类,可以得到其头部信息或者访问模式,是 get 或者 post 等

四 常见http方法之post与get

1. 常见HTTP请求方法:

POST:

  • 获取信息
  • 提交的信息会展示在url中

GET:

  • 提交信息, 不在url里面展示, 有利于数据的安全性;

2. 默认路由接受的请求方法为__get__

如何指定接收多个HTTP请求方法? [email protected](’/login/’, methods=[‘GET’, ‘POST’])

路由: @app.route('/login/', methods=['GET', 'POST'])
视图函数: def login():

3. 如何判断用户请求的HTTP方法?

   request.method

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

request.form['user']

5.模板渲染(jinja2)

python中生成html不易修改与维护, 所以将html的内容独立到templates目录中。
python的Web开发中,业务逻辑(实质就是视图函数的内容)和表现逻辑(html文件)分开的, 使得代码的可读性增强,代码容易理解和维护,表现逻辑往往放在模板中。

步骤:
  • 1). 去当前项目目录下寻找templtes是否存在?再去判断templates目录下是否有login.html文件
  • 2). 读取这个login.html文件的内容, 作为render_template的返回值;
  • 3). 最终返回给用户浏览器;
render_template('login.html')

6. 重定向和错误

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

7.网络404处理

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

具体如下:

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

app=Flask(__name__)

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

@app.route('/login/',methods=['GET','POST'])
def login():
    if request.method=='POST':
        print(request.form)

        #1.如何获得用户提交的信息呢?
        user=request.form['user']
        passwd=request.form['passwd']
        #2.判断用户名和密码是否正确
        if user=='root' and passwd=='redhat':
            #如果登陆成功,跳转到主页
            return redirect(url_for('index'))
        else:
            #如果登陆失败,重新登陆
            return render_template('login.html',message='用户名或密码错误')
    else:
        #用户是GET请求, 返回登陆的html页面
        #1.读取login.html文件的内容
        #2.将读取的内容返回给用户界面
        return render_template('login.html')

#404异常处理
@app.errorhandler(404)
def not_find(e):
    return render_template('404.html')

#抛出异常
@app.route('/user//')
def user(user_id):
    if 0

五 Flask自带的模版引擎:jinja2

模板渲染: 在html文件中,通过动态赋值 ,将重新翻译好的html文件(模板引擎生效) 返回给用户的过程。
其他的模板引擎: Mako, Template, Jinja2

1.python中自带模板

Flask框架一_第6张图片

2.Jinja2变量显示语法: {{ 变量名 }}
#for循环:
    {% for i in li%}

    {% endfor %}

# if语句
    {% if user == 'westos'%}


    {% elif user == 'hello' %}

    {% else %}

    {% endif%}

示例:

from flask import Flask,render_template

app=Flask(__name__)

class User(object):
    def __init__(self,name,passwd):
        self.name=name
        self.passwd=passwd
    def __str__(self):
        return '' %(self.name)

@app.route('/')
def index1():
    name='这是一个消息'
    li=[1,2,3,4]
    d=dict(a=1,b=3)
    u=User('Merry','passwd')
    return render_template('index1.html',li=li,
                           name=name,d=d,u=u)

app.run()

index1.html:




    
    Title


变量:{{name}}

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

Flask框架一_第7张图片

3.时间转换操作

import  time
import  os

print(time.time())
print(time.ctime())
print(time.localtime())
print(time.localtime().tm_hour)

#时间戳--->字符串
mtime  = os.path.getmtime('/etc/passwd')
print(time.ctime(mtime))

ttime = time.localtime(mtime)
#元组--->指定字符串
print(time.strftime("%Y-%m-%d %H:%M:%S", ttime))

在这里插入图片描述

4.过滤器与自定义过滤器

import time
from flask import Flask, render_template

app=Flask(__name__)

class User(object):
    def __init__(self,name,passwd):
        self.name=name
        self.passwd=passwd
    def __str__(self):
        return '' %(self.name)
@app.route('/')
def hello():
    name='      This is a news'
    li=[1,2,3,4]
    d=dict(a=1,b=3)
    liDict=[
        {'count':100,'price':30},
        {'count':90,'price':20},
    ]
    u=User('Merry','passwd')
    return render_template('hello.html',
                           name=name,
                           li=li,
                           d=d,
                           u=u,
                           liDict=liDict,
                           )
app.run()

hello.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框架一_第8张图片
如下也ok:

import time
from flask import Flask, render_template

app=Flask(__name__)

class User(object):
    def __init__(self,name,passwd):
        self.name=name
        self.passwd=passwd
    def __str__(self):
        return '' %(self.name)
@app.route('/')
def index2():
    name='      This is a news'
    li=[1,2,3,4]
    d=dict(a=1,b=3)
    liDict=[
        {'count':100,'price':30},
        {'count':90,'price':20},
    ]
    u=User('Merry','passwd')
    timestamp=time.time()
    return render_template('index2.html',
                           name=name,
                           li=li,
                           d=d,
                           u=u,
                           liDict=liDict,
                           timestamp=timestamp
                           )

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)

app.add_template_filter(format_date, 'format_date')

app.run()

index2.html:




    
    Title


过滤器实质上就是一个转换函数/方法 {{ timestamp }} {{ timestamp | format_date }}
/*常见的字符串过滤器操作:*/
  • {{ name | upper }}
  • {{ name | lower }}
  • {{ "hello" | capitalize }}
  • {{ " hello world" | capitalize }}
  • {{ name | reverse }}
/*常见数值操作*/
    四舍五入
  • {{ -12.9623423435 | round }}
  • {{ -12.9623423435 | round | abs }}
/*列表常见:*/
  • {{ li }}
  • {{ li | first }}
  • {{ li | last }}
  • {{ li | length }}
  • {{ li | sum }}
  • {{ li | sort | reverse }}
  • {{ li | join(":") }}
  • {{ ["hello", "world"] | upper}}
  • {{ ["hello", "woHld"] | lower}}
/*列表包含字典常用操作:*/
    {% for item in liDict | sort(attribute='price', reverse=false) %} {{ item }} {% endfor %}

Flask框架一_第9张图片

5. 模板与继承

模板继承语法:

    1. 如何继承某个模板?
            {% extends "模板名称" %}

    2. 如何挖坑和填坑?
    挖坑:
        {% block 名称 %}
            默认值
        {% endblock %}

    填坑:
        {% block 名称 %}
        {% endblock %}

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

    填坑:
        {% block 名称 %}
            #如何继承挖坑时的默认值?
            {{ super() }}

            # 后面写新加的方法.
            ........
        {% endblock %}

6. 宏macro的使用

定义一个html文件,可以改写包含此宏的html

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

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