python-flask框架

什么是Flask?

Flask是一个Web框架,就是提供一个工具,库和技术来允许你构建一个Web应用程序.这个Web应用程序 可以是一些Web页面,博客, wiki ,基于 Web 的日历应用或商业网站。
Flask依赖模块: web服务网关接口(Python Web Server Gateway Interface,缩写为WSGI

Werkzeug 一个WSGI工具包, 是为python语言定义的web服务器和web应用程序或框架之间的一 种简单而通用的借				口,其他语言也有类似的接口) 

jinja2模板引擎 

Flask的优势

Flask属于微框架( micro-framework )这一类别,微架构通常是很小的不依赖外部库的框架.
框架很轻量
更新时依赖小
专注于安全方面的bug

Flask 应用

第一个网站

from flask import  Flask
app = Flask(__name__)

# 实现首页: http://172.25.254.197:9999/
@app.route('/')  # 路由
def index():    # 视图函数, 一定不能重复;
    return  '这是网站的首页'


@app.route('/login/')
def login():
    return  "正在登录......"

@app.route('/logout/')
def logout():
    return  "正在登出......"

if __name__ == '__main__':
    # 运行Flask项目, 默认ip和端口是127.0.0.1:5000
    # 如何特色化指定? host='0.0.0.0'  开放本机的所有IP port=5000 端口必须是整形数
    # debug=True: 是否开启调试模式, 测试环境中开启, 生产环境一定要关闭.
    app.run(host='0.0.0.0', port=9999, debug=True)

路由和变量规则

# 1.路由中的变量规则

    有时候需要接收URL中的参数变量,可以把参数标记为一个变量<变量名>,这个部分将会作为命名参数传递给函数。
    同时还可以限制参数变量的类型<类型:变量名>。
# 2. 数据类型一共有三种:int, float, path
    类型	        描述
    int	        接受整数
    float	    同 int ,但是接受浮点数
    path	    和默认的相似,但也接受斜线

# 3. 范例1:
    http://www.csdn.org/12000
    http://www.csdn.org/12001
    http://www.csdn.org/12002
    http://www.csdn.org/12003


# 4.范例2-动态路由:
    http://www.csdn.org/



from flask import  Flask, request


app = Flask(__name__)


@app.route('//')
def userinfo(userid):
    return  "正在查看用户%s的详细博客........" %(userid)


@app.route('/welcome/')
def welcome(username):
    return  "欢迎访问%s用户的主页" %(username)



"""
https://movie.douban.com/top250?start=25&filter=
"""
@app.route('/top250')
def top250():
    users = ['user%s' %(i) for i in range(100)]
    # request存储用户请求页面的所有头部信息
    print("客户端的用户代理: ", request.user_agent)  # Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0
    print("请求页面的头部信息: ", request.headers)
    print("客户端的IP:",  request.remote_addr)  # 127.0.0.1
    print("客户端请求的参数详细信息: ", request.args)  # ImmutableMultiDict([('start', '25'), ('user', 'westos')])

    print("客户端HTTP请求方法: ", request.method) # GET
    # 获取用户请求的url地址里面可以对应的value值;
    start = int(request.args.get('start'))   # '25'
    user = request.args.get('user')     # 'westos'
    # return  'top 250  显示数据开始:%s条   用户名: %s' %(start, user)
    import json
    return  json.dumps(users[start:start+10])


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

登录验证和get请求

"""
# 1.Http请求中常见的请求方式: GET POST
    1). url可见性:
        get,参数url可见;
        post,url参数不可见
    2). 数据传输上:
        get,通过拼接url进行传递参数;
        post,通过body体传输参数
    3). 缓存性:
        get请求是可以缓存的
        post请求不可以缓存
    4). 后退页面的反应
        get请求页面后退时,不产生影响
        post请求页面后退时,会重新提交请求
    5). 传输数据的大小
        get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大)
        post请求传输数据可以无限大。
    6). 安全性: 原则上post肯定要比get安全。

# 2. 模版渲染
    hello {{ name }}
    name = westos    hello westos

    Flask和Django一样都配备了Jinja2模版引擎,可以使用render_template()方法来渲染模版。

# 3. 重定向和错误(redirect,error)
    使用redirect()函数把用户重定向到其他地方。 '/bbs' ---> '/login'
    使用abort()函数,放弃请求并返回错误代码。  # HTTP状态码: 404, 200, 304, 500

"""

from flask import Flask, render_template, request, redirect

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

主页

" @app.route('/login/') def login(): """ 一般情况, 不会直接把html文件内容直接返回; 而是将html文件保存到当前的templates目录中; 1). 通过render_template方法调用; 2). 默认情况下,Flask 在程序文件夹中的 templates 子文件夹中寻找模板。 """ return render_template('login.html') @app.route('/login2/') def login2(): # 获取用户输入的用户名 username = request.args.get('username', None) password = request.args.get('password', None) # 逻辑处理, 用来判断用户和密码是否正确; if username == 'root' and password == 'redhat': # 重定向到指定路由; # 如果登录成功, 进入主页. return redirect('/') # return "登录成功" else: # return "登录失败" # 如果登录失败, 重定向到登录界面重新登录; return redirect('/login/') if __name__ == '__main__': app.run()

登录验证post请求

"""

# 1.自定义错误页面:
    1). 为什么要自定义错误页面?
    如果你在浏览器的地址栏中输入了不可用的路由,那么会显示一个状态码为 404 的错误页
    面。现在这个错误页面太简陋、平庸.
    2). 如何自定义错误页面?
    像常规路由一样,Flask 允许程序使用基于模板的自定义错误页面。
    最常见的错误代码有两个:
            - 404,客户端请求未知页面或路由时显示;
            - 500,有未处理的异常时显示。

"""

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

app = Flask(__name__)

@app.route('/')
def index():
    return "这是主页"


# 默认路由只支持get方法, 如何指定接受post方法?
@app.route('/login/', methods=['GET', 'POST'])
def login():
    """
    1. 用户访问网址: http://xxxx/login, 返回登录的html页面;
        方法method: GET
    2. 用户在表单中填写信息,
        
3. 执行post提交的逻辑; :return: """ if request.method == 'POST': # 难点: post请求提交的数据如何获取? request.form # 难点: get请求提交的数据如何获取? request.args print(request.form) username = request.form.get('username') password = request.form.get('password') # 如果用户名和密码正确, 跳转到主页; if username == 'root' and password == 'redhat': return redirect('/') # 如果登录不正确, 则警告红色信息;还是在登录页面; else: # 可以给html传递变量 return render_template('login_post.html', errMessages="用户名或者密码错误" ) else: # abort(500) return render_template('login_post.html') @app.route('/welcome/') def welcome(username): app.logger.error("欢迎界面......") return render_template('welcome.html', name=username) @app.errorhandler(404) def page_not_found(e): return render_template("404.html"), 404 @app.errorhandler(500) def internal_server_error(e): return render_template("500.html"), 500 if __name__ == '__main__': app.run()

flask 日志记录

"""
格式化中的常用参数如下:

%(name)s                Logger的名字

%(levelno)s         数字形式的日志级别

%(levelname)s   文本形式的日志级别

%(pathname)s        调用日志输出函数的模块的完整路径名,可能没有

%(filename)s         调用日志输出函数的模块的文件名

%(module)s

调用日志输出函数的模块名

%(funcName)s

调用日志输出函数的函数名

%(lineno)d

调用日志输出函数的语句所在的代码行

%(created)f

当前时间,用UNIX标准的表示时间的浮 点数表示

%(relativeCreated)d

输出日志信息时的,自Logger创建以 来的毫秒数

%(asctime)s

字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

%(thread)d

线程ID。可能没有

%(threadName)s

线程名。可能没有

%(process)d

进程ID。可能没有

%(message)s

用户输出的消息

"""

from flask import Flask
import logging

app = Flask(__name__)

# 日志系统配置, 设置文件存放位置;
handler = logging.FileHandler('app.log', encoding='UTF-8')
# 设置日志文件存储格式
logging_format = logging.Formatter(
            '%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
# 将日至文件处理对象和日至格式绑定,
handler.setFormatter(logging_format)
handler.setLevel('DEBUG')
# 将日志格式和app绑定;
app.logger.addHandler(handler)


@app.route('/')
def index():
    app.logger.debug('hello')
    app.logger.error('error')
    app.logger.exception('exception')
    app.logger.info('hello')
    return  'index'

if __name__ == '__main__':
    app.run(debug=True, port=8000)

jinja2模板引擎

"""
# 1. 什么是Jinja2模板引擎?(官方网址: http://docs.jinkan.org/docs/jinja2/)
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全:
    1). python的Web开发中, 业务逻辑(实质就是视图函数的内容)和页面逻辑(html件)分开的, 使得代码的可读性增强, 代码容易理解和维护;
    2). 模板渲染: 在html文件中,通过动态赋值 ,将重新翻译好的html文件(模板引擎生效) 返回给用户的过程。
    3). 其他的模板引擎: Mako, Template, Jinja2
# 2. 语法
    1). Jinja2变量显示语法: {{ 变量名 }}
        完整的过滤器查看位置: http://jinja.pocoo.org/docs/templates/#builtin-filters
    2). Jinja2变量内置过滤器:
            safe            渲染值时不转义
            capitalize      把值的首字母转换成大写,其他字母转换成小写
            lower           把值转换成小写形式
            upper           把值转换成大写形式
            title           把值中每个单词的首字母都转换成大写
            trim            把值的首尾空格去掉
            striptags       渲染之前把值中所有的 HTML 标签都删掉
    3). 如何自定义过滤器?
    4). for循环:
        {% for i in li%}
            xxx
        {% endfor %}
    5). if语句
        {% if user == 'westos'%}
            xxxx
        {% elif user == 'hello' %}
            xxx
        {% else %}
            xxx
        {% endif%}

# 3.宏的操作====相当于函数
    1).  如何定义宏?
        
        {%  macro render(id) %}
            

hello world {{ id }}

{% endmacro %} 2). 如何调用宏? {{ render(1) }} {{ render(2) }} {{ render(3) }} # 4. include包含操作 如何使用: {% include "06_inclued.html"%} # 5. 模板的继承: 一般网站的导航栏和底部不会变化, 为了避免重复编写导航栏信息; 1). 如何定义模板? {% block title %} {% endblock %}
这是导航栏
{% block body %} hello {% endblock %}
这是底部
2). 如何继承基模板? {% extends '06_base.html'%} {% block title %} 继承案例 {% endblock %} {% block body %} 这是最新填的block内容 {% endblock %} """

你可能感兴趣的:(Python)