从首页问答标题到问答详情页

    1. 主PY文件写视图函数,带id参数。
    2. @app.route('/detail/<question_id>')
      def detail(question_id):
          quest = 
          return render_template('detail.html', ques = quest)
    3. 首页标题的标签做带参数的链接。
      1. {{ url_for('detail',question_id = foo.id) }}
    4. 在详情页将数据的显示在恰当的位置。
    5. {{ ques.title}}
      {{ ques.id  }}{{  ques.creat_time }}
      {{ ques.author.username }} 
      {{ ques.detail }}

 

主py:

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

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)


class Fabu(db.Model):
    __tablename__ = 'fabu'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), nullable=False)
    detail = db.Column(db.Text, nullable=False)
    creat_time = db.Column(db.DateTime, default=datetime.now)  # 提交时间会自己赋值
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 数据类型是db.Integer,db.ForeignKey参数指定外键是哪个表中哪个id
    author = db.relationship('User', backref=db.backref('fabu'))  # 建立关联,其author属性将返回与问答相关联的用户实例,相当于数据库中的表连接
    # 第一个参数表明这个关系的另一端是哪个类,第二个参数backref,将向User类中添加一个fabu属性,从而定义反向关系,这一属性可访问Fabu类,获取的是模型对象


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():
    context = {
        'fabus': Fabu.query.order_by('-creat_time').all()
    # order_by('-creat_time')按时间降序排列,Fabu.query.all()查出了Fabu类的所有元组
    }
    return render_template('daohang.html', **context)  # **context将该封装传递到daohang.html中调用,而上下文处理器是可以在任何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:  # 判断用户名
            if user.password == password:  # 判断密码
                session['user'] = username  # 利用session添加传回来的值username
                session.permanent = True  # 设置session过期的时间
                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}  # 包装到username,在所有html模板中可调用
    else:
        return {}  # 返回空字典,因为返回结果必须是dict


# 跳转注销。
@app.route('/logout')
def logout():
    session.clear()  # 注销时删除所有session
    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重定向


# 定义decorator可以增强函数功能,装饰器本身是函数,入参是函数,返回值也是函数
def loginFirst(fabu):
    @wraps(fabu)  # 加上wraps,它可以保留原有函数的__name__,docstring
    def wrapper(*args, **kwargs):  # 定义wrapper函数将其返回,用*args, **kwargs把原函数的参数进行传递
        if session.get('user'):  # 只有经过登陆,session才能记住并get到值
            return fabu(*args, **kwargs)
        else:
            return redirect(url_for('denglu'))

    return wrapper


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


# 跳转发布。
@app.route('/fabu/', methods=['GET', 'POST'])  # methods定义它有两种请求方式
@loginFirst  # 将decorator定义的增强函数放在待增强函数定义的上面
def fabu():
    if request.method == 'GET':
        return render_template('fabu.html')
    else:
        title = request.form.get('title')  # post请求模式,安排对象接收数据
        detail = request.form.get('detail')
        author_id = User.query.filter(User.username == session.get('user')).first().id  # 将session get到的user进行查询并取出id放到外键author_id中
        fabu = Fabu(title=title, detail=detail, author_id=author_id)  # 将对象接收的数据赋到Fabu类中,即存到数据库
        db.session.add(fabu)  # 执行操作
        db.session.commit()  # 提交到数据库
        return redirect(url_for('daohang'))  # redirect重定向


# 跳转发布详情
@app.route('/fabuview/<fabu_id>')  # 和idea的update一样,将id带到控制器
def fabuview(fabu_id):
    fa = Fabu.query.filter(Fabu.id == fabu_id).first()  # 根据id查询出整条元组记录,丢进fa
    return render_template('fabuview.html', fa=fa)  # 把值fa丢进键fa,在fabuview.html页面调用


# 方法二:
# fabu={
# 'fa':Fabu.query.filter(Fabu.id == fabu_id).first()
# }
# return render_template('fabuview.html',**fabu)


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

daohang.html:(首页)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>
        首页
        {% block denglutitle %}{% endblock %}
        {% block zhucetitle %}{% endblock %}
        {% block tupiantitle %}{% endblock %}
        {% block fabutitle %}{% endblock %}
        {% block fabu_viewtitle %}{% 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') }}">
    <link rel="stylesheet" href="{{ url_for('static',filename='css/wenben.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 %}
    {% block fabu_viewhead %}{% 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 navbar-right">
                {% if username %}
                    <li><a href="#" onclick="">{{ username }}</a></li>
                    <li><a href="{{ url_for('logout') }}" onclick=""><span class="glyphicon glyphicon-log-out"></span>
                        注销</a></li>
                {% else %}
                    <li><a href="{{ url_for('denglu') }}" onclick=""><span class="glyphicon glyphicon-log-in"></span> 登陆</a>
                    </li>
                    <li><a href="{{ url_for('zhuce') }}" onclick=""><span class="glyphicon glyphicon-user"></span>
                        注册</a></li>
                {% endif %}
            </ul>
        </div>
        <div style="float: right">
            <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>
            <ul class="nav navbar-nav">
                <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>
            <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>
<div id="navtop"></div>

<p class="text-center">
    <script>document.write(Date())</script>
</p>


{% block daohangbody %}
    <div class="container">
        <div class="row clearfix">
            <div class="col-md-2 column s1">
                <h3>
                    标题3(以下是无序标签)
                </h3>
                <ul>
                    <li>
                        Lorem ipsum dolor sit amet
                    </li>
                    <li>
                        Consectetur adipiscing elit
                    </li>
                    <li>
                        Integer molestie lorem at massa
                    </li>
                    <li>
                        Facilisis in pretium nisl aliquet
                    </li>
                    <li>
                        Nulla volutpat aliquam velit
                    </li>
                    <li>
                        Faucibus porta lacus fringilla vel
                    </li>
                    <li>
                        Aenean sit amet erat nunc
                    </li>
                    <li>
                        Eget porttitor lorem
                    </li>
                </ul>
            </div>
            <div class="col-md-6 column s1">
                <h3 class="text-center">发布</h3>
                <ul class="list-unstyled">
                    {% for foo in fabus %}
                        <li class="list-group-item-success">
                            <a href="#">{{ foo.author.username }}</a>
                            <h4 class="text-center"><a href="{{ url_for('fabuview',fabu_id=foo.id) }}">{{ foo.title }}</a></h4>
                            <span class="badge pull-right">{{ foo.creat_time }}</span>
                            <br>
                            <p>{{ foo.detail }}</p>
                        </li>
                    {% endfor %}
                </ul>
            </div>
            <div class="col-md-4 column">
                <ul class="nav nav-pills">
                    <li class="active">
                        <a href="#"> <span class="badge pull-right">42</span> Home</a>
                    </li>
                    <li>
                        <a href="#"> <span class="badge pull-right">16</span> More</a>
                    </li>
                </ul>
            </div>
        </div>
    </div>
{% endblock %}


</body>
</html>
daohang.html

fabuview.html:(发布详情页)

{% extends 'daohang.html' %}
{% block fabu_viewtitle %}发布内容{% endblock %}
{% block fabu_viewhead %}
    <link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.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>
{% endblock %}
{% block daohangbody %}
    <div class="col-md-2 column "></div>
    <div class="col-md-8 column ">
        <ul class="list-unstyled">
            <li>
                <h2 href="#" class="text-center">{{ fa.title }}</h2>
                <br>
                <p class="text-center">
                    <a href="#">
                        <small>{{ fa.author.username }}</small>
                    </a>&nbsp&nbsp&nbsp
                    <span class="pull-center"><small>{{ fa.creat_time }}</small></span>
                </p>
                <hr>
                <p>{{ fa.detail }}</p>
                <hr>
                <form>
                    <div class="form-group">
                    <textarea name="comment" class="form-control" rows="5" id="comment"
                              placeholder="请输入评论"></textarea>
                    </div>
                    <button type="submit" class="btn btn-default">发送</button>
                </form>
            </li>
        </ul>
    </div>
    <div class="col-md-2 column "></div>
{% endblock %}
fabuview.html

 

posted on 2017-12-05 09:06  L文斌  阅读(252)  评论(0编辑  收藏  举报