Python之Flask框架应用(一)

########Flask框架#######

 

 

 

## 对于flask框架的理解

 -    对于Flask框架而言,它属于众多Python Web开发框架的一种,如果说Django是一个自带后台管理的全能型的框架,那么Flask则是一种非常轻便使用的框架,它提供了搭建Web服务的必要组建,并且具有良好的扩展性。

 

 

## 对于Flask的基本用法理解

 

- 导入 Flask类

from flask import Flask

- 实例化一个Flask对象

app = Flask(__name__)

   # __name__是模块的名称或者包的名称  作用: __name__  参数传给 Flask类的构造函数,创建了一个程序实例app,也就创建了一个Flask集成的开发Web服务器;Flask用 __name__ 这个参数决定程序的根目录,以便程序能够找到相对于程序根目录的资源文件位置,比如静态文件等.

-  基本路由:通过路由绑定一个试图函数

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

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

hello world

"

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

-  运行Flask应用,可以指定IP和端口

app.run('0.0.0.0', 9000)                             # '0.0.0.0' 所有的IP都可以访问到

from flask import Flask

app = Flask(__name__)


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

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

app.run('0.0.0.0', 5000)

       Python之Flask框架应用(一)_第1张图片

       Python之Flask框架应用(一)_第2张图片

 

 

## 路由于变量规则

 

-  在flask框架中常见的路由规则里

   # url的一部分可以标记未变量<变量名> 例如:int,string,float,path,uuid

   # 比如http:www.douban.org/123457677/comments/
 

from flask import Flask

app = Flask(__name__)


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


@app.route('/1234567//')
def id(user):
    return 'id  %s' % (user)


app.run(port=5001)

Python之Flask框架应用(一)_第3张图片

 

## 特殊的url地址

# 特殊的url地址: http://www.baidu.com/query?id=123&name=houzeyu
@app.route('/query')
def query():
    # 获取url地址里面key对应的value值
    id = request.args.get('id')
    name = request.args.get('name')
    return "id:%s, name:%s" % (id, name)

Python之Flask框架应用(一)_第4张图片

 

 

 

## 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地址的请求方法;
    # methods is a list of methods this rule should be limited
    # to (``GET``, ``POST`` etc.).  By default a rule
    # just listens for ``GET``
    print(request.method)
    # url_for: 根据函数名, 反向生成url地址
    return "用户正在访问url地址:%s" % (url_for(endpoint='welcome', user='houzeyu'))
    # response = url_for(endpoint='welcome', user='houzeyu')
    # return response

app.run(port=5003)

Python之Flask框架应用(一)_第5张图片

Python之Flask框架应用(一)_第6张图片

 

 

## _常见HTTP方法之POST与GET

 

-  常见的HTTP请求方法

-  GET方法:获取信息,提交的信息会显示在URL里面

-  POST方法:提交信息,不会显示在url里面,而是提交给后台处理,有利于数据的安全性

-  默认路由请求的方法是GET 方法,所以我们需指定多个HTTP请求方法,例如:

   # @app.route('/route/', methods = ['GET', 'POST'])

   # 在后台可以用 request.method 来查看用户请求的HTTP方法

   # 获取用户POST请求提交的表单数据:request.form['name的值']

 

-  模板渲染(jinja2):

# python中生成html不易修改与维护, 所以将html的内容独立到templates目录中;

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

 

-  抛出异常:(测试代码)
@app.route('/user//')
def user(user_id):
    if 0         return  "欢迎访问: %s" %(user_id)
    else:
        abort(404)

 

代码:

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

app = Flask(__name__)


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


@app.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user = request.form['user']
        passwd = request.form['passwd']
        if user == 'root' and passwd == 'redhat':
            return redirect(url_for('index'))
        else:
            return render_template('login.html', message='帐号密码错误')
    else:
        return render_template('login.html')

# 404异常处理:类似于捕获异常
@app.errorhandler(404)
def not_found(e):
    return render_template('404.html')


if __name__ == '__main__':
    app.run(port=5001)

## 特别注意:在编写代码时需要将html页面里的数据进行修改,如form表单里面,action关联的后台路由、method='post'、name的值等。

## 另外此代码在用户名输入错误时引入了jinja2模板引擎的语法结构。

login.html页面:

    
{% if message %}

{{ message }}

{% endif %}

实现结果:

Python之Flask框架应用(一)_第7张图片

Python之Flask框架应用(一)_第8张图片

Python之Flask框架应用(一)_第9张图片

 

 

 

## 模板引擎

-  在python中有自带的模板引擎,例如:

# 1. python中自带的模板
import  string

strObj  = string.Template("$who is $role")
# 渲染字符串的过程;
print(strObj.substitute(who="redhat", role="cat"))

Python之Flask框架应用(一)_第10张图片

-  jinja2 模板引擎

## python的Web开发中, 业务逻辑(实质就是视图函数的内容)和页面逻辑(html文件)分开的, 使得代码的可读性增强, 代码容易理解和维护;
## 模板渲染: 在html文件中,通过动态赋值 , 将重新翻译好的html文件(模板引擎生效) 返回给用户的过程。jinja2模板引擎能更好的进行渲染作用。

 

-  jinja2基本语法展示

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

    {% endfor %}

# if语句
    {% if user == 'world'%}
    {% elif user == 'hello' %}

    {% else %}

    {% endif%}

 

-  jinja2传值

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 test():
    name = "message"
    li = [1, 2, 3, 4, 5]
    d = dict(a=1, b=3, c=5)
    u = User("redhat", "passwd")
    return render_template('test.html',
                           name=name,
                           li=li,
                           d=d,
                           u=u
                           )

app.run(port=5003)



    
    Title


变量:

{{ name }}

列表:

{{ li }} /*依次遍历列表的每一个元素*/ {% for i in li %}
列表元素显示: {{ i }} {% endfor %}

字典:

{{ d }}

字典:

{{ d.a }}

字典:

{{ d['a'] }}

字典:

{{ d.b }}

字典:

{{ d['b']}}

对象:

{{ u }}

Python之Flask框架应用(一)_第11张图片

 

 

 

## 过滤器与自定义过滤器

 

-  time模块回顾

import os
import time

print(time.time())
print(time.ctime())
print(time.localtime())
print(time.localtime().tm_mon)
mtime = os.path.getmtime('/etc/passwd')
print(mtime)
#时间戳转化字符串时间
print(time.ctime(mtime))
#时间戳转化元祖
ttime= time.localtime(mtime)
print(ttime)
# 修改指定字符串格式
print(time.strftime("%Y-%m-%d %H:%M:%S", ttime))

Python之Flask框架应用(一)_第12张图片

 

## 过滤器:实质上就是一个转换函数/方法

import os
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 test1():
    name = " this is a message"
    li = [1, 2, 4, 5]
    d = dict(a=1, b=2, c=3)
    liDict = [
        {
            'count': 100,
            'price': 30
        },
        {
            'count': 110,
            'price': 20
        },

    ]
    u = User('redhat', 'passwd')
    timestamp = time.time()
    return render_template('test.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(port=5005)

# 上述代码中我们重新定义了一个format_date函数,利用add_template_filter(函数名,'名字')方法自定义了一个时间的过滤器,

   在html文件里面,利用jinja2语句    {{ timestamp | format_date}}   使得过滤器生效.




    
    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 %}

运行结果:

Python之Flask框架应用(一)_第13张图片

 

 

 

## template模板的继承

 

-  template模块的继承实质上就时在众多html文件里找到相同的代码,并用jinja2语句对相同的代码进行继承使用,从而减轻复杂程度。

# 模板继承的语法:

1,继承模板 {% extends  "模板名称" %}

2,挖坑和填坑

      挖坑 {% block 名称 %}

                  默认值

               {% endblock  %}

       填坑 {% block  名称 %}

                {% endblock %}

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

                    默认值

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

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

 

代码:

首先我们在template模板里新建base.html文件,将index.html文件以及login.html文件里面共有的部分用继承的方式写在base.html文件里,操作如下:

base.html:




    
    {% block title %} 首页 {% endblock %} | houzeyu
    
    
    






{% block content %}



{% endblock %}



    



index.html:

{% extends "base.html" %}

{% block title %}
{#  #}
{{ super() }}
{% endblock %}


{% block content %}

新闻名称

flask框架. 25K评论. 7分钟前

新闻名称

flask框架. 25K评论. 7分钟前

新闻名称

Web开发. 25K评论. 7分钟前

新闻名称

Django. 25K评论. 7分钟前
{% endblock %}

login.html:

{% extends "base.html" %}
{% block title %}
登陆
{% endblock %}

{% block content %}
  

登录 没有账号?注册

{% if message %}

{{ message }}

{% endif %}
{% endblock %}

可见,通过模板继承大大减少了代码量。

 

 

 

 

 

##################################

你可能感兴趣的:(学习)

用户名 密码
{{ u.name }} {{ u.passwd }}