Flask是一个Web框架,就是提供一个工具,库和技术来允许你构建一个Web应用程序.这个Web应用程序 可以是一些Web页面,博客, wiki ,基于 Web 的日历应用或商业网站。
Flask依赖模块: web服务网关接口(Python Web Server Gateway Interface,缩写为WSGI
Werkzeug 一个WSGI工具包, 是为python语言定义的web服务器和web应用程序或框架之间的一 种简单而通用的借 口,其他语言也有类似的接口)
jinja2模板引擎
Flask属于微框架( micro-framework )这一类别,微架构通常是很小的不依赖外部库的框架.
框架很轻量
更新时依赖小
专注于安全方面的bug
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()
"""
# 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()
"""
# 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. 用户在表单中填写信息,
"""
格式化中的常用参数如下:
%(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)
"""
# 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 %}
"""