期末作品检查

经过一个学期的Python+mysql的web建设技术课程学习,我已经掌握了基本的数据库后台跟页面前端联系到一起的简单web设计,对Python这门语言也有了一定程度的掌握跟了解,我发现Python语言很简洁,比如,完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。,它的功能也是非常的强大,所以说Python语言使用度的飞跃也是有它原因的。对于初学者和完成普通任务,Python语言是非常简单易用的。连Google都在大规模使用Python,很多著名的网站包括YouTube就是Python写的。Python当然也有不能干的事情,比如写操作系统,这个只能用C语言写;写手机应用,只能用Swift/Objective-C(针对iPhone)和Java(针对Android);写3D游戏,最好用C或C++。Python为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,用Python开发,许多功能不必从零编写,直接使用现成的即可。

刚开始学这门语言就觉得这门语言很有趣,因为它代码简洁,就算是初学者都很容易明白代码的意思,从开始入门学的时间类,分析文字出现,字典,列表,turtle画图,到现在的前端html+flask+python结合起来的一个项目都比较顺利,目前已经掌握了用python实现后台进行数据库建表的表信息的增加,删除,修改,查询功能,各项功能代码如下:

1.导航条

导航条代码用到了bootstrap里面的样式,里面放了链接可以跳转到相应的方法,还有继承功能,把一个模板的一些东西继承过去,代码会变得更加整洁,美观,便于后期的维护和管理

 <nav class="navbar navbar-inverse" role="navigation">
        <div class="container-fluid">
            <div class="navbar-header">
                <a href="{{ url_for('index') }}" class="navbar-brand">首页</a>
            </div>
            <ul class="nav navbar-nav">
                <li><a href="{{ url_for('question') }}">发帖</a></li>
            </ul>
            <form class="navbar-form navbar-left" action="{{ url_for('search') }}" method="get">
                <div class="form-group">
                    <input name="q" type="text" class="form-control" placeholder="请输入关键字">
                </div>
                <select class="form-control" name="fenlei" id="fenlei">
                    <option value="">请选择文章类别</option>
                    <option value="游记">游记</option>
                    <option value="随笔">随笔</option>
                    <option value="景评">景评</option>
                </select>
                <button type="submit" class="btn btn-default">搜索</button>
            </form>

            <ul class="nav navbar-nav navbar-right">
                {% if sessusername %}
                    <li><a href="{{ url_for('user',user_id =session.get('userid'),tag = 1) }}">{{ sessusername }}</a></li>
                    <li><a href="{{ url_for('logout') }}">注销</a></li>
                {% else %}
                    <li><a href="{{ url_for('regist') }}"><span class="glyphicon glyphicon-user"></span> 注册</a></li>
                    <li><a href="{{ url_for('login') }}"><span class="glyphicon glyphicon-log-in"></span> 登录</a>
                    </li>
                {% endif %}
                <li style="float: right"><img id="myOnOff" onclick="mySwitch()"
                                              src="http://www.runoob.com/images/pic_bulbon.gif"
                                              class="bulb"></li>
            </ul>

        </div>
    </nav>

2.建表

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(20), nullable=False)
    _password = db.Column(db.String(200), nullable=False)#内部使用
    nickname = db.Column(db.String(20))

    @property
    def password(self):  # 外部使用
        return self._password

    @password.setter
    def password(self, row_password):#定义属性
        self._password = generate_password_hash(row_password)


    def check_password(self,row_password):
        result = check_password_hash(self._password,row_password)#检查密码
        return result


class Question(db.Model):
    __tablename__ = 'question'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    fenlei = db.Column(db.String(100), nullable=False)
    title = db.Column(db.String(100), nullable=False)
    detail = db.Column(db.Text, nullable=False)
    create_time = db.Column(db.DateTime, default=datetime.now)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    author = db.relationship('User', backref=db.backref('question'))  # 反向定义一个question


class Comment(db.Model):
    __tablename__ = 'comment'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    question_id = db.Column(db.Integer, db.ForeignKey('question.id'))
    create_time = db.Column(db.DateTime, default=datetime.now)
    detail = db.Column(db.Text, nullable=False)
    question = db.relationship('Question', backref=db.backref('comments', order_by=create_time.desc))
    author = db.relationship('User', backref=db.backref('comments'))

 3.基本表操作

# 增加
# user = User(username='tan1997',password='19961021')
# db.session.add(user)
# db.session.commit()

# 查询
# user = User.query.filter(User.username == 'tan1997').first()
# print(user.username,user.password)

# 修改
# user=User.query.filter(User.username == 'tan1997').first()
# user.password=1234567
# db.session.commit()

# 删除
# user=User.query.filter(User.username == 'tan1997').first()
# db.session.delete(user)
# db.session.commit()

4.自行编写的点赞功能

首先新建了dianzan表,里面包括id,author_id,question_id,外键是author_id,question_id,大概思路就是在详细页面放点赞按钮,判定是否已经点赞,如果还没有点赞就显示一个空心爱心,如果点击了点赞就会出现实心爱心,并显示有多少个点赞,数据过程是把question_id,author_id带到detail页面,在详情页点击点赞按钮的时候,就会获取到这两个id然后将数据存到数据库。

class Dianzan(db.Model):
    __tablename__ = 'dianzan'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    question_id = db.Column(db.Integer, db.ForeignKey('question.id'))
    author = db.relationship('User', backref=db.backref('dianzan'))
    question = db.relationship('Question', backref=db.backref('dianzan'))
@app.route('/detail/<question_id>',methods=['GET', 'POST'])
def detail(question_id):
    quest = Question.query.filter(Question.id==question_id).first()
    comments=Comment.query.filter(Comment.question_id==question_id).all()
    ifdianzan = Dianzan.query.filter(
        and_(Dianzan.author_id == session.get('userid'), Dianzan.question_id == question_id)
    ).first()
    return  render_template('detail.html',ques=quest,comments=comments,ifdianzan=ifdianzan)

@app.route('/dianzan/',methods=['GET', 'POST'])
@loginFirst#使用定义的装饰器
def dianzan():
    author_id=request.form.get('author_id')
    question_id=request.form.get('question_id')
    dianzan=Dianzan(author_id=author_id,question_id=question_id)
    db.session.add(dianzan)
    db.session.commit()
    return redirect(url_for('detail',question_id=question_id))
<form action="{{ url_for('dianzan',question_id=qusetion_id) }}" method="post">
                    <input type="hidden" name="question_id" value="{{ ques.id }}">
                    <input type="hidden" name="author_id" value="{{ session.get('userid') }}">
                    {% if ifdianzan %}
                        <button type="button" class="btn btn-default btn-xs pull-right">
                            <span class="glyphicon glyphicon-heart">{{ ques.dianzan|length }}</span>
                        </button>
                    {% else %}
                        <button type="submit" class="btn btn-default btn-xs pull-right">
                            <span class="glyphicon glyphicon-heart-empty"></span>
                        </button>
                    {% endif %}
                </form>

5.自行添加了修改密码的功能,一开始学习了数据库的增查改功能,所以将修改功能应用在修改密码上面,原理就是在个人中心有已经带过去的userid,在点击修改密码之后就会根据userid去到用户表查询出这个id的password然后在修改页面将输入的密码对原来的密码进行update操作,然后就完成了密码修改功能。

@app.route('/edit_password/', methods=['GET', 'POST'])
def edit_password():
    if request.method == 'GET':
        return render_template("edit_password.html")
    else:
        newpassword = request.form.get('password')
        user = User.query.filter(User.id == session.get('userid')).first()
        user.password = newpassword
        db.session.commit()
        return redirect(url_for('index'))
  <form action="{{ url_for('edit_password') }}" method="post">
                    <label>请输入密码</label>
                    <input type="password" class="form-control" id="password" name="password"
                           placeholder="请输入密码">
                    <br>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <button type="submit" class="btn btn-default" style="margin-left: 30%">保存</button>
                        </div>
                    </div>
                </form>

 

在自主学习python和摸索过程中我也遇到过很多问题,比如数据库外键跟主键问题,

定义主键和外键主要是为了维护关系数据库的完整性,总结一下:
1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。

身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。 
2.外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。

比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。

还有参数传递问题,想要把参数带到页面,在方法里面就必须要先定义它,我在添加上面两项功能的时候就是对于定义参数变量比较弱,然后经过多次反复操作查看才找出了问题所在,所以我还是要继续加强练习。

在作项目过程中要用到表之间的连接来实现一些功能,就要定义一个关系链接比如:

 author = db.relationship('User', backref=db.backref('question'))  # 反向定义一个question

这样就可以将两个表连在一起将信息显示出来。

整个项目包括了个人中心,发布问答,登录,注册,详情页,评论页,搜索还有页面的继承功能,个人中心页面比较特别,里面用了双重继承,这样页面变得更加的美观

 

 

 学习了python+flask web开发,我觉的自己真正的学到了东西,从新手到会独立完成自己的项目,过程中遇到很多问题,查阅资料,问同学之后都解决了, 虽然这个学期python课程学习结束了,但是对于我来说学习的程度不会止于此,我还要继续学习python语言,因为这门语言对我来说吸引力很大,可以作为以后专门发展的方向,我觉得自己在语言方面还不够规范跟熟练,学习态度还要继续端正,计算机语言在现在,将来都会是很受用的一样技能,上大学就是要学习真正的技术,学到了技术,将来出到社会才能在激烈的竞争中取胜,我还要继续加强学习。

posted @ 2018-01-02 11:17  yishhaoo  阅读(165)  评论(0编辑  收藏  举报