登录之后更新导航

  1. 用上下文处理器app_context_processor定义函数
    1. 获取session中保存的值
    2. 返回字典
  2. 在父模板中更新导航,插入登录状态判断代码。、
    1. 注意用{% ... %}表示指令。
    2. {{ }}表示变量
  3. 完成注销功能。
    1. 清除session
    2. 跳转

 

主py:

from flask import Flask, render_template, request, redirect, url_for, session
from flask_sqlalchemy import SQLAlchemy
import config

app = Flask(__name__)  # 创建Flask对象
app.config.from_object(config)  # 关联config.py文件进来
db = SQLAlchemy(app)  # 建立和数据库的关系映射


class User(db.Model):  # 创建类User
    __tablename__ = 'user'  # 类对应的表名user
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # autoincrement自增长
    username = db.Column(db.String(20), nullable=False)  # nullable是否为空
    password = db.Column(db.String(20), nullable=False)
    nickname = db.Column(db.String(20), nullable=True)

db.create_all()  # 测试是否连接成功

'''
# 插入功能
user = User(username='15',password='12')
db.session.add(user)
db.session.commit()

# 查询功能
user=User.query.filter(User.username=="15").first()
print(user.username,user.password)

# 修改功能
user=User.query.filter(User.username=="15").first()
user.password='888'
db.session.commit()

# 删除功能
user=User.query.filter(User.username=="15").first()
db.session.delete(user)
db.session.commit()
'''


# session会话连接
# filter()过滤器
# route制定路径和函数之间的关系
# def定义一个变量

@app.route('/')  # 跳转首页。
def daohang():
    return render_template('daohang.html')


@app.route('/lin/')  # 跳转测试。
def lin():
    return 'lin'

# 跳转登陆。
@app.route('/denglu/', methods=['GET', 'POST'])  # methods定义它有两种请求方式
def denglu():
    if request.method == 'GET':
        return render_template('denglu.html')
    else:
        username = request.form.get('user')  # post请求模式,安排对象接收数据
        password = request.form.get('pass')
        user = User.query.filter(User.username == username).first()   # 作查询,并判断
        if user:   #判断用户名
            session['user'] = username   #利用session添加传回来的值username
            session.permanent = True   #设置session过期的时间
            if user.password == password:   #判断密码
                return redirect(url_for('daohang'))
            else:
                return u'用户密码错误'
        else:
            return u'用户不存在,请先注册'


@app.context_processor   #上下文处理器,定义变量然后在所有模板中都可以调用,类似idea中的model
def mycontext():
    user = session.get('user')
    if user:
        return{'username':user}
    else:
        return{}   #返回空字典,因为返回结果必须是dict

# 跳转注销。
@app.route('/logout')
def logout():
    session.clear()
    return redirect(url_for('daohang'))


# 跳转注册。
@app.route('/zhuce/', methods=['GET', 'POST'])  # methods定义它有两种请求方式,因为它在表单的请求是post,类似我们在idea中的sava请求模式
def zhuce():
    if request.method == 'GET':
        return render_template('zhuce.html')
    else:
        username = request.form.get('user')  # post请求模式,安排对象接收数据
        password = request.form.get('pass')
        nickname = request.form.get('nickname')
        user = User.query.filter(User.username == username).first()  # 作查询,并判断
        if user:
            return u'该用户已存在'
        else:
            user = User(username=username, password=password, nickname=nickname)  # 将对象接收的数据赋到User类中,即存到数据库
            db.session.add(user)  # 执行操作
            db.session.commit()
            return redirect(url_for('denglu'))  # redirect重定向


# 跳转图片。
@app.route('/tupian/')
def tupian():
    return render_template('tupian.html')


# 跳转发布。
@app.route('/fabu/')
def fabu():
    return render_template('fabu.html')


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

config.py:

import os
DEBUG = True

SECRET_KEY = os.urandom(24)

DIALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = 'root'
PASSWORD = 'ROOT'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'mis_db'

# 配置和数据库的连接信息
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@localhost/mis_db?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = False

daohang.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>
        首页
        {% block denglutitle %}{% endblock %}
        {% block zhucetitle %}{% endblock %}
        {% block tupiantitle %}{% endblock %}
        {% block fabutitle %}{% endblock %}
    </title>
    <link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" href="{{ url_for('static',filename='css/daohang.css') }}">
    <script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script src="{{ url_for('static',filename='js/daohang.js') }}"></script>
    {% block dengluhead %}{% endblock %}
    {% block zhucehead %}{% endblock %}
    {% block tupianhead %}{% endblock %}
    {% block fabuhead %}{% endblock %}
</head>
<body id="mybody">

<nav class="navbar navbar-inverse" role="navigation">
    <div class="container-fluid">
        <div class="navbar-header">
            <a class="navbar-brand" href="{{ url_for('daohang') }}">首页</a>
        </div>
        <div>
            <ul class="nav navbar-nav">
                {% if username %}
                    <li><a href="#" onclick="">{{ username }}</a></li>
                    <li><a href="{{ url_for('logout') }}" onclick="">注销</a></li>
                {% else %}
                    <li><a href="{{ url_for('denglu') }}" onclick="">登陆</a></li>
                    <li><a href="{{ url_for('zhuce') }}" onclick="">注册</a></li>
                {% endif %}

                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                        设置 <b class="caret"></b>
                    </a>
                    <ul class="dropdown-menu">
                        <li><a href="#">收藏</a></li>
                        <li><a href="#">分享</a></li>
                        <li><a href="#">搜索</a></li>
                        <li class="divider"></li>
                        <li><a href="#">点赞</a></li>
                    </ul>
                </li>
                <li><a href="#">||</a></li>
            </ul>
        </div>
        <div style="float: left">
            <img id="myonoff" onclick="mySwitch()" src="http://www.runoob.com/images/pic_bulbon.gif" style="width:40px">
        </div>
        <div>
            <ul class="nav navbar-nav">
                <li><a href="{{ url_for('tupian') }}" onclick="">图片区</a></li>
            </ul>
            <ul class="nav navbar-nav">
                <li><a href="{{ url_for('fabu') }}" onclick="">发布</a></li>
            </ul>
        </div>
        <div>
            <input type="text" name="sousuo" id="sousuo" placeholder="请输入内容">
            <input type="button" value="搜索" class="btn btn-success" onclick="">
        </div>
    </div>
</nav>

<nav class="navbar navbar-inverse navbar-fixed-bottom" role="navigation">
    <ul class="nav navbar-nav">
        <li><img src="http://www.gzcc.cn/2016/images/footer1-logo.png"></li>
        <li style="color: bisque;">版权所有@lin</li>
    </ul>
</nav>

<center>
    <script>document.write(Date())</script>
</center>


{% block denglubody %}{% endblock %}
{% block zhucebody %}{% endblock %}
{% block tupianbody %}{% endblock %}
{% block fabubody %}{% endblock %}
</body>
</html

 

posted on 2017-11-24 09:43  L文斌  阅读(177)  评论(0编辑  收藏  举报