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 '<h1>hello world</h1>'

@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)


在这里插入图片描述

二 路由与变量规则

常见路由的规则:

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

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

app=Flask(__name__)

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

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

app.run()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三 URL构建与反向URL

from flask import Flask, request, url_for

app=Flask(__name__)

@app.route('/welcome/<string:user>')
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()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过 request类,可以得到其头部信息或者访问模式,是 get 或者 post 等

四 常见http方法之post与get

1. 常见HTTP请求方法:

POST:

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

GET:

  • 提交信息, 不在url里面展示, 有利于数据的安全性;
2. 默认路由接受的请求方法为__get__

如何指定接收多个HTTP请求方法? __@app.route(’/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/<int:user_id>/')
def user(user_id):
    if 0<int(user_id)<=100:
        return '欢迎访问:%s' %(user_id)
    else:
        abort(404)

app.run()

五 Flask自带的模版引擎:jinja2

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

1.python中自带模板

在这里插入图片描述

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 '<User:%s>' %(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:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
变量:{{name}}
<br>列表:{{li}}
{% for i in li %}
<br>列表元素显示:{{i}}
{% endfor %}
<br>字典:{{d}}
<br>字典元素显示:{{d.a}}
<br>字典元素显示:{{d['b']}}
<br>对象:{{u}}
<table>
    <tr>
        <th>用户名</th>
        <th>密码</th>
    </tr>
    <tr>
        <td>{{u.name}}</td>
        <td>{{u.passwd}}</td>
    </tr>
</table>
</body>
</html>

在这里插入图片描述

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 '<User:%s>' %(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:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>字符串</h3>
<ul>
    <li>{{name | upper}}</li>
    <li>{{name | lower}}</li>
    <li>{{'hello' | capitalize}}</li>
    <li>{{name | reverse}}</li>
</ul>
<h3>数值</h3>
<ul>
    <li>{{li}}</li>
    <li>{{li | first}}</li>
    <li>{{li | last}}</li>
    <li>{{li | length}}</li>
    <li>{{li | sum}}</li>
    <li>{{li | sort}}</li>
    <li>{{li | reverse}}</li>
    <li>{{li | join(':')}}</li>
</ul>

</body>
</html>

在这里插入图片描述
如下也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 '<User:%s>' %(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:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<br>
<!--/*什么是过滤器?-->
过滤器实质上就是一个转换函数/方法
{{ timestamp }}
{{ timestamp | format_date }}
<br>/*常见的字符串过滤器操作:*/
<ul>
    <li>{{ name | upper }}</li>
    <li>{{ name | lower }}</li>
    <li>{{ "hello" | capitalize }}</li>
    <li>{{ " hello world" | capitalize }}</li>
    <li>{{ name | reverse }}</li>
</ul>
/*常见数值操作*/
<ul>
    四舍五入
    <li>{{ -12.9623423435 | round }}</li>
    <li>{{ -12.9623423435 | round | abs }}</li>
</ul>
/*列表常见:*/
<ul>
    <li>{{ li }}</li>
    <li>{{ li | first }}</li>
    <li>{{ li | last }}</li>
    <li>{{ li | length }}</li>
    <li>{{ li | sum }}</li>
    <li>{{ li | sort | reverse }}</li>
    <li>{{ li | join(":") }}</li>
    <li>{{ ["hello", "world"] | upper}}</li>
    <li>{{ ["hello", "woHld"] | lower}}</li>
</ul>
/*列表包含字典常用操作:*/
<ul>
    {% for item in liDict | sort(attribute='price', reverse=false) %}
    {{ item }}
    {% endfor %}
</ul>
</body>
</html>

在这里插入图片描述

5. 模板与继承

模板继承语法:

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

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

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

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

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

            # 后面写新加的方法.
            ........
        {% endblock %}
6. 宏macro的使用

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

{% macro 函数名(变量)%}
html代码样(包含需要替换的变量)
{% endmacro %}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值