hello.py 启动页面。
# hello.py 启动页面。
import redis
from flask import Flask
from flask_script import Manager
from flask_session import Session
from app.views import blue # 导入app文件夹下views.py文件中的blue变量
app = Flask(__name__)
# 第二步: 管理蓝图
app.register_blueprint(blueprint=blue) # =blue是上面导入的那个
# 加密,加密复杂程度和设值有关
app.secret_key = '1234567890'
# 配置session信息
# from flask_session import Session
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port=6379)
Session(app)
manage = Manager(app)
if __name__ == '__main__':
# app.run()
manage.run()
views.py 内容页面
# views.py 内容页面
from flask import render_template, make_response, \
request, session, Blueprint, redirect, \
url_for
from utils.functions import is_login
# 蓝图,管理路由地址
# 第一步: 生成蓝图对象
blue = Blueprint('first', __name__)
@blue.route('/')
def hello():
return 'hello world'
@blue.route('/make_res/')
def make_res():
# make_response('响应内容', 响应状态码)创建响应对象
# return make_response('hello flask day02', 200)
# return make_response('<h2>今天天气不好</h2>')
index = render_template('index.html')
return make_response(index, 200)
@blue.route('/register/', methods=['GET', 'POST'])
def register():
print(request.method)
if request.method == 'GET':
return render_template('register.html')
if request.method == 'POST':
# 模拟注册功能
# 1. 获取页面中传递的参数
username = request.form.get('username')
password = request.form.get('password')
password2 = request.form.get('password2')
# 模拟注册
if username == 'coco' and password == password2 \
and password == '123456':
# 返回登录页面
return redirect(url_for('first.login'))
# return render_template('login.html')
else:
return render_template('register.html')
@blue.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
if request.method == 'POST':
# 1.获取参数
username = request.form.get('username')
password = request.form.get('password')
# 2.模拟登陆
if username == 'coco' and password == '123456':
# 向cookie中设置参数
res = make_response(render_template('index.html'))
# 设置cookie
res.set_cookie('token', '12345678', max_age=3000)
return res
else:
return render_template('login.html')
@blue.route('/logout/')
def my_logout():
# 注销
res = make_response(render_template('login.html'))
res.delete_cookie('token')
return res
@blue.route('/index/')
def index():
# 登陆过后能看到index.html页面, 没有登录跳转到登录页面
token = request.cookies.get('token')
if token == '12345678':
# 判断登陆成功了
return render_template('index.html')
else:
# 判断登陆失败了
return render_template('login.html')
@blue.route('/session_login/', methods=['GET', 'POST'])
def session_login():
if request.method == 'GET':
return render_template('session_login.html')
if request.method == 'POST':
# 解析参数
username = request.form.get('username')
password = request.form.get('password')
if username == 'coco' and password == '123456':
# 向session会话中设置键值对
session['login_status'] = 1
# session['name'] = 'coco'
# session['pwd'] = '123456'
return render_template('index.html')
else:
return render_template('session_login.html')
@blue.route('/session_index/')
@is_login
def session_index():
# if 'login_status' in session:
return render_template('index.html')
# else:
# return render_template('session_login.html')
@blue.route('/xindex/')
@is_login
def xindex():
# 登录过后能够访问index.html页面
# 没有登录不让访问,跳转到session_login.html页面
return render_template('index.html')
@blue.route('/session_logout/')
def session_my_logout():
# 注销
del session['login_status']
return render_template('session_login.html')
@blue.route('/redirect_func/')
def redirect_func():
# 跳转到登录页面
# return render_template('login.html')
# return redirect('/login/')
# url_for('蓝图的第一个参数.跳转的函数名')
# print(url_for('first.login'))
# return redirect(url_for('first.login'))
# return redirect('/s_id/1/')
return redirect(url_for('first.s_id', id=100))
#上 重定向 打开页面
@blue.route('/s_id/<int:id>/')
def s_id(id): #int:id s_id(id): % id 三个id的名字必须一样
return 's_id: %s' % id
# 下午模板内容
@blue.route('/student/')
def stu():
stus_score = [90, 89, 100, 99, 87, 67]
content_h2 = '<h2>千锋真棒!</h2>'
return render_template('stu.html',
scores=stus_score, # 返回变量到html文件
content_h2=content_h2) # 返回变量到html文件
html文件的继承
# 1 base.html 父页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
<!--jinja2-->
{% block title %} # 父类开接口,在子类中写内容填充
{% endblock %}
</title>
{% block css %}
{% endblock %}
{% block js %}
{% endblock %}
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
# 2.base_min.html 父页面初始化
{% extends 'base.html' %} # 继承base.html
{% block js %} # 填父类中名为js的接口
<!--初始化引入jquery.js文件-->
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
{% endblock %} #内容到此为止
# 3. stu.html 最终显示的网页
{% extends 'base_main.html' %}
{% block title %}
学生列表页面
{% endblock %}
{% block css %}
<!--第一种写法-->
<!--<link rel="stylesheet" href="/static/css/style.css">-->
<!--第二种写法-->
<link rel="stylesheet"
href="{{ url_for('static', filename='css/style.css') }}">
{% endblock %}
{% block js %}
{{ super() }} # 加上这个,js文件两个可以同时生效。这里的script和2.xx.html两个地方的js
<script src="2q3weftrfe.js"></script>
{% endblock %}
{% block content %}
<!--过滤器-->
<p> {{ content_h2 | safe }} </p> # 将字符串显示为标签内容
<p>{{ 'Python' | length }}</p> # 显示字符串长度
<p>{{ 'Python' | upper }}</p> # 大写
<p>{{ 'Python' | lower }}</p> # 小写
<p>{{ 'python' | upper | length }}</p> # 两个连接的显示最后一个的内容
<p>{{ 'Python' | reverse }}</p> # 倒序
<p>{{ content_h2 | striptags }}</p> # 去掉字符串标签符显示内容
<!--解析变量使用 {{ 变量名 }}-->
<p> {{ scores }} </p> # scores是py文件中传过来的变量
<!--解析标签,extends,block,for-->
{# {{ 注释内容 }} #} # 这个表示注释,内容写在中间
<ul>
{% for a in scores %}
{{ loop.revindex0 }} # 显示a的序号,倒着显示,最小为0
{{ loop.index }} # 显示a的序号,从1开始
{{ loop.first }} # 第一个显示为True
{{ loop.last }} # 最后一个显示为True
<li {% if loop.index == 1 %} style="color:yellow;" {% endif %}>
{{ a }}
</li>
{% else %} # 如果for循环中scores没内容,显示下面的标签
<li>没有学生成绩数据</li>
{% endfor %} # for循环的结束处
</ul>
<table>
<thead>
<th>姓名</th>
<th>年龄</th>
</thead>
<tbody>
<tr>
<td>张三</td>
<td>28</td>
</tr>
<tr>
<td>李四</td>
<td>29</td>
</tr>
</tbody>
</table>
{% endblock %}