期末作品检查
经过一个学期的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语言,因为这门语言对我来说吸引力很大,可以作为以后专门发展的方向,我觉得自己在语言方面还不够规范跟熟练,学习态度还要继续端正,计算机语言在现在,将来都会是很受用的一样技能,上大学就是要学习真正的技术,学到了技术,将来出到社会才能在激烈的竞争中取胜,我还要继续加强学习。