python16(Flask-bootstrap)
1)get方法
1.获取页面信息
1)一般情况, 不会直接把html文件内容直接返回,而是将html文件保存到当前的目录中:
2)通过方法调用;
默认情况下,Flask 在程序文件夹中的 子文件夹中寻找模板。
2.可以提交数据信息,但是数据不安全
eg::5000/login/?=root&=
from flask import Flask, render_template, request, redirectapp = 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 "登录失败"if __name__ == '__main__':app.run()
from flask import Flask, request, render_template, redirect
app = Flask(__name__)@app.route('/')
def index():return "这是主页"# 默认路由只支持get方法, 如何指定接受post方法?
@app.route('/login/', methods=['GET', 'POST'])
def login():if request.method == 'POST':# 难点: post请求提交的数据如何获取?print(request.form)username = request.form.get('username', None)password = request.form.get('password', None)# 如果用户名和密码正确, 跳转到主页;if username == 'root' and password == 'redhat':return redirect('/')# 如果登录不正确, 则警告红色信息;还是在登录页面;else:# 可以给html传递变量return render_template('login_post.html',errMessages="用户名或者密码错误")else:return render_template('login_post.html')@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()
在目录中创建 login.html 文件:
Title
用户登录
登录成功后则不显示用户名和密码,保证了数据的安全
2)post方法并自定义错误页面
提交服务端需要的请求信息,有利于数据的安全性
from flask import Flask, request, render_template, redirect
app = Flask(__name__)@app.route('/')
def index():return "这是主页"# 默认路由只支持get方法, 如何指定接受post方法?
@app.route('/login/', methods=['GET', 'POST'])
def login():if request.method == 'POST':# 难点: post请求提交的数据如何获取?print(request.form)username = request.form.get('username', None)password = request.form.get('password', None)# 如果用户名和密码正确, 跳转到主页;if username == 'root' and password == 'redhat':return redirect('/')# 如果登录不正确, 则警告红色信息;还是在登录页面;else:# 可以给html传递变量return render_template('login_post.html',errMessages="用户名或者密码错误")else:return render_template('login_post.html')@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()
在目录中创建 .html 文件:
Title
用户登录
登录成功,则返回主页;登录失败,则警告红色信息:
#自定义错误页面
1.为什么要自定义错误页面?
如果你在浏览器的地址栏中输入了不可用的路由,那么会显示一个状态码为 404 的错误页面。现在这个错误页面太简陋、平庸,所以你可以根据自己的喜好自定义错误页面。
2.如何自定义错误页面?
像常规路由一样,Flask 允许程序使用基于模板的自定义错误页面。
最常见的错误代码有两个:
404:客户端请求未知页面或路由时显示;
500:有未处理的异常时显示。
3.自定义错误页面
Title
404
Title
服务器正忙, 请稍后再试
2.模板引擎
1. 什么是模板引擎?
1.的Web开发中, 业务逻辑(实质就是视图函数的内容)和页面逻辑(html文件)分开的, 使得代码的可读性增强, 代码容易理解和维护;
2.模板渲染: 在html文件中,通过动态赋值 ,将重新翻译好的html文件(模板引擎生效) 返回给用户的过程。
3.其他的模板引擎: Mako, ,
2. 语法
1) 变量显示语法: {{ 变量名 }}
完整的过滤器查看位置: #-
变量内置过滤器:
如何自定义过滤器?
from flask import Flask, render_template
app = Flask(__name__)class User(object):def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return "" %(self.name)@app.route('/')
def index():message = " this is a Message "li = ['fentiao', 'fensi', 'fendai']info = {'name': 'fentiao','age':10}fentiao = User(name="粉条", age=5)tags = "hello world
"return render_template('06_index.html',message=message,names = li,info=info,fentiao=fentiao,tags = tags)@app.route('/users/')
def users():usersinfo = [('user%s' %(i), "password%s" %(i)) for i in range(100)]return render_template('06_users.html',usersinfo = usersinfo)@app.route("/macro/")
def macro():return render_template('06_macro.html')@app.route('/extends/')
def extends():return render_template('06_use_block.html')
# **********************自定义过滤器******************************
# 定义一个函数
def format_data(s):return "这是一个过滤器:" + s
# 将该函数添加到默认过滤器中;
app.add_template_filter(format_data, 'fmt')if __name__ == '__main__':app.run()
在index.html中写过滤器:
Title
{{ message | fmt}}
{{ message | lower}}
{{ message | upper}}
{{ message | title}}
{{ message | capitalize}}
{{ names }}
{{ info }}
{{ fentiao }}
{{ tags | striptags }}
{{ tags | safe }}
这是一个过滤器: this is a Messagethis is a messageTHIS IS A MESSAGEThis Is A Messagethis is a message['fentiao', 'fensi', 'fendai']{'name': 'fentiao', 'age': 10}hello world
hello world
2)for循环:
{% for i in li%}{% endfor %}
3)if语句
{% if user == 'westos'%}{% elif user == 'hello' %}{% else %}{% endif%}
*4)宏的操作====相当于函数*
{% macro render(id) %}hello world {{ id }}
{% endmacro %}
{{ render(1) }}
{{ render(2) }}
{{ render(3) }}
5)包含操作
如何使用:
{% include "06_inclued.html"%}
6)模板的继承
一般网站的导航栏和底部不会变化, 为了避免重复编写导航栏信息;
{% block title %} {% endblock %} 这是导航栏{% block body %}hello{% endblock %}这是底部
{% extends '06_base.html'%}{% block title %}继承案例
{% endblock %}{% block body %}
这是最新填的block内容{% endblock %}
3.前端框架
1.什么是框架?
是美国公司推出的一个用于前端开发的开源工具包。它由的设计师Mark Otto和Jacob 合作基于HTML、CSS、 开发的简洁、直观、强悍的前端开发框架,使得 Web 开发更加快捷。
提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。
学习网站:
2.flask项目静态文件的导入
用框架写HTML之前,先了解几个知识点:
导入静态文件
两种方法:
# 通过路径导入
# 通过url_for函数导入
3.flask链接的导入
两种方法:
# 直接查找路由
注册# 根据视图函数动态的去查找路径
登录
删除 == /delete/root/
4.消息闪现
1)如何实现闪现?
flash 闪现消息这种功能,是Flask的核心特性。用于在下一个响应中显示一个消息,让用户知道状态发生了变化。可以确认消息,警告或者错误提醒。
2)工作原理
闪现系统使得在一个请求结束的时候记录一个信息,然后在且仅仅在下一个请求中访问这个数据。
3)使用方法
flash(“闪现的消息”)
4)html代码中如何调用闪现内容?
仅调用flash()函数并不能把消息显示出来,程序使用的模板要渲染这些消息;Flask把()函数开放给模板,用来获取并渲染消息
5.用户信息的保存
:客户端浏览器的缓存
:服务端缓存
1)的作用
对象存储特定用户会话所需的属性及配置信息。
1.当用户在应用程序的 Web 页之间跳转时,存储在 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
2.当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 对象。
3.当会话过期或被放弃后,服务器将终止该会话。 对象最常见的一个用法就是存储用户的首选项。
from flask import Flask, session
import random
app = Flask(__name__)
app.config['SECRET_KEY'] = random._urandom(24)
# 设置是24位的字符, 每次运行服务器的secret_key都是不同的,
# 服务器重启后会清除上一次存储的session信息值;
2)设置值
@app.route('/')
def index():# 如何设置session的key-value值session['name'] = 'westos'return "hello world"
3)获取
@app.route('/get/')
def get():return session.get('name')
4)删除
@app.route('/delete/')
def delete():print(session.get('name'))session.pop('name')print(session.get('name'))return 'delete'
6.应用 —— 实现用户注册, 用户登录, 用户注销, 用户查看
1)首先创建一个Flask项目
File ----> New ----> Flask
2.在 app.py 中写需要实现基本路由和视图函数
代码:
from functools import wraps
from flask import Flask, render_template, request, redirect, flash, url_for, sessionusers = [{'username': 'root','password': 'root'}
]app = Flask(__name__)
app.config['SECRET_KEY'] = 'westos'def is_login(f):"""用来判断用户是否登录成功"""@wraps(f)def wrapper(*args, **kwargs):# 判断session对象中是否有seesion['user']:# 如果包含信息,则登录成功,可以访问主页;# 如果不包含信息,则未登录成功,跳转到登录界面; if session.get('user', None):return f(*args, **kwargs)else:flash('用户必须登录才能访问主页%s' % (f.__name__))return redirect(url_for('login'))return wrapperdef is_admin(f):"""用来判断用户是否为管理员"""@wraps(f)def wrapper(*args, **kwargs):# 如果是管理员,则可以访问;# 如果不是管理员,则跳转到登录界面登录管理员账号;if session.get('user', None) == 'root':return f(*args, **kwargs)else:flash('只有管理员root才能访问%s' % (f.__name__))return redirect(url_for('login'))return wrapper@app.route('/')
@is_login
def index():return render_template('index.html')@app.route('/register/', methods=['GET', 'POST'])
def register():if request.method == 'POST':username = request.form.get('username', None)password = request.form.get('password', None)# 当所有的信息遍历结束,都没有发现注册的用户存在,则将注册的用户添加到服务器,并跳转登录界面for user in users:if user['username'] == username:return render_template('register.html', message='用户%s已经存在' % (username))else:users.append(dict(username=username, password=password))# 出现一个闪现信息flash('用户%s已经注册成功,请登录......' % (username))return redirect(url_for('login'))return render_template('register.html')@app.route('/login/', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form.get('username', None)password = request.form.get('password', None)for user in users:if user['username'] == username and user['password'] == password:# 将用户登录的信息存储到session中session['user'] = usernamereturn redirect(url_for('index'))else:flash('用户名或密码错误,请重新登录......')return redirect(url_for('login'))return render_template('login.html')@app.route('/logout')
def logout():# 将用户存储到session中的信息删除session.pop('user')flash('注销成功')return redirect(url_for('login'))@app.route('/delete//')
def delete(username):for user in users:# 用户存在,则删除if username == user['username']:users.remove(user)flash('删除用户%s成功' % (username))# 删除成功, 跳转到/list/路由中return redirect(url_for('list'))@app.route('/list/')
@is_login
@is_admin
def list():return render_template('list.html', users=users)if __name__ == '__main__':app.run()
3)在 目录下创建 xxx.html 文件实现页面
将页面导航栏、页面样式和闪现信息写在继承模板 base.html 中:
西部开源-{% block title %} {% endblock %}
{# 让每个页面都可以获取闪现信息闪现 #}
{% for item in get_flashed_messages() %}{{ item }}
{% endfor %} {% block content %}{% endblock %}
4)主页页面 index.html
{% extends 'base.html' %}{% block title %} 主页 {% endblock %}{% block content %}这是主页
{% endblock %}
5)注册页面 .html
{% extends 'base.html' %}{% block title %} 注册页面 {% endblock %}{% block content %}
注册已有帐号登录
{# action: 将表单填写的数据提交到那个URL里面进行处理 #}{# url_for('register'): 根据视图函数寻找对应的url地址 == /register/ #}{# method =['post', 'get']: 这种是错误的,提交数据只能选择一种HTTP请求方法 #} {% if message %}{{ message }}
{% endif %}
{% endblock %}
**6)登录页面 login.html **
{% extends 'base.html' %}{% block title %} 登录页面 {% endblock %}{% block content %}
登录没有帐号?注册
{% if message %}{{ message }}
{% endif %}
{% endblock %}
7)用户信息显示页面 list.html
{% extends 'base.html' %}{% block title %} 用户显示 {% endblock %}{% block content %}用户信息显示
用户名 密码 删除 {% for user in users %}{# user是一个字典,获取字典的key值 ----> user.keyname #}{{ user.username }} {{ user.password }} {# 删除的按钮 #}删除 {% endfor %}
{% endblock %}
1.注册帐号
2.登陆帐号
登录成功后,显示主页:
想要查看用户信息时,点击导航栏的用户信息
由于用户信息包含用户的账号和密码,一般只有管理员才有权限查看,所以需要登录管理员账号
登录root用户
删除hello用户
import osfrom flask import Flask, render_template, request, redirect, url_for, flash, session
from functools import wrapsusers = [{'username': 'root','password': 'root'},{'username': 'hello','password': 'root'},]# 实现用户注册, 用户登录, 用户注销, 用户查看;
app = Flask(__name__)
app.config['SECRET_KEY'] = 'westos'def is_login(f):"""用来判断用户是否登录成功"""@wraps(f)def wrapper(*args, **kwargs):# 判断session对象中是否有seesion['user'],# 如果包含信息, 则登录成功, 可以访问主页;# 如果不包含信息, 则未登录成功, 跳转到登录界面;;if session.get('user', None):return f(*args, **kwargs)else:flash("用户必须登录才能访问%s" % (f.__name__))return redirect(url_for('login'))return wrapperdef is_admin(f):"""用来判断用户是否登录成功"""@wraps(f)def wrapper(*args, **kwargs):# 判断session对象中是否有seesion['user']等于root,# 如果包含信息, 则登录成功, 可以访问主页;# 如果不包含信息, 则未登录成功, 跳转到登录界面;;if session.get('user', None) == 'root':return f(*args, **kwargs)else:flash("只有管理员root才能访问%s" % (f.__name__))return redirect(url_for('login'))return wrapper# 面试常问: 复习: 1. 装饰器的工作原理; 2. 如果有多个装饰器, 运行流程是怎样的?
@app.route('/')
@is_login
def index():return render_template('index.html')@app.route('/register/', methods=['GET', 'POST'])
def register():if request.method == 'POST':username = request.form.get("username", None)password = request.form.get('password', None)# 当所有的信息遍历结束, 都没有发现注册的用户存在, 则将注册的用户添加到服务器, 并跳转登录界面;for user in users:if user['username'] == username:return render_template('register.html', message="用户%s已经存在" % (username))else:users.append(dict(username=username, password=password))# return redirect('/login/')# 出现一个闪现信息;flash("用户%s已经注册成功, 请登录....." % (username), category='info')return redirect(url_for('login'))return render_template('register.html')@app.route('/login/', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form.get("username", None)password = request.form.get('password', None)# 当所有的信息遍历结束, 都没有发的用户存在, 则将注册的用户添加到服务器, 并跳转登录界面;for user in users:if user['username'] == username and user['password'] == password:# 将用户登录的信息存储到session中;session['user'] = usernamereturn redirect(url_for('index'))else:# 出现一个闪现信息;flash("用户%s密码错误, 请重新登录....." % (username))return redirect(url_for('login'))return render_template('login.html')@app.route('/logout/')
def logout():# 将用户存储到session中的信息删除;session.pop('user')flash("注销成功........")return redirect(url_for('login'))@app.route('/delete//')
def delete(username):for user in users:# 用户存在, 则删除;if username == user['username']:users.remove(user)flash("删除用户%s成功" % (username))else:flash("用户%s不存在" % (username))# 删除成功, 跳转到/list/路由中.....return redirect(url_for('list'))@app.route('/list/')
@is_login
@is_admin
def list():return render_template('list.html',users=users)@app.route('/upload/', methods=['POST', 'GET'])
def upload():if request.method == 'POST':# 获取用户上传的文件对象f = request.files['faceImg']# 获取上传文件的文件名# print(f.filename)# 获取当前项目的目录位置;basepath = os.path.dirname(__file__)# print(__file__) # /root/PycharmProjects/day34/app.py# print(basepath) # /root/PycharmProjects/day34# /root/PycharmProjects/day34/static/img/face/xxx.png# 拼接路径, 保存到本地的位置;filepath = os.path.join(basepath, 'static', 'img', 'face', f.filename)# 保存文件f.save(filepath)flash("上传文件%s成功" %(f.filename))return redirect(url_for('upload'))else:return render_template('upload.html')if __name__ == '__main__':app.run()
4.Flask中集成
1. 什么是
()是 开发的一个开源框架,它提供的用户界面组件可用于创建整洁且具有吸引力的网页,而且这些网页还能兼容所有现代 Web 浏览器。
2. Flask中如何集成
使用 pip 安装 Flask- 的 Flask 扩展,简化集成的过程。
导入模块并实例化一个对象:
from flask_bootstrap import Bootstrap
bootstrap = Bootstrap(app)
3. Flask-实现了什么
1.利用 的模板继承机制,让程序扩展一个具有基本页面结构的基模板,其中就有用来引入 的元素。
# 在页面逻辑的基模板base.html中
{ % extends “bootstrap/base_other.html” % }
2.基模板中定义了可再衍生模板中重定义的块。
块名 说 明doc 整个 HTML 文档html_attribs 标签的属性html 标签中的内容head 标签中的内容title 标签中的内容metas 一组 标签styles 层叠样式表定义body_attribs 标签的属性body 标签中的内容navbar 用户定义的导航条content 用户定义的页面内容scripts 文档底部的 JavaScript 声明
3.程序需要向已经有内容的块中添加新内容,必须使用 提供的 super() 函数。
{% block scripts %}
{{ super() }}