一、个人学期总结
经过一个学期的学习,信息管理系统课程终于接近了尾声。经过这阶段的学习,我有很多的收获和思考,认识到自己的很多不足之处,现在十分有必要对自己关于本学期信息管理系统课程的学习做一个总结,以形成经验,提高自己。
首先,这个学期第一次接触到了python这门语言,我感受到python语言的优雅,明确,简单,比起Java语言更适合我们这种小白学习。比如,当我们完成同一个任务,Java语言需要写100多行代码,而python语言可能只要20多行代码就能够把程序实现。对于我们这种初学者来说容易入门,而且将来深入学习下去也可以编写一些复杂的程序。此外,在这学期,我们还学习了构造前端html。初次学HTML,我觉得一个前端的布局很有趣,可以按照自己的想法把一个页面构造起来,蛮有成就感的。但是,慢慢地,我发现要想建立一个好看的网页需要的知识储备还要很多,所以我们不能满足于现有的知识,要勇于开拓知识。而且,我们此次构造网页运用python+flask+mysql的web开发,把后台连接到了数据库上,让我们对数据库的学习也更深一步。对于我来说这种web开发模式相比其他Java开发更容易理解也更简洁,简直就是没学好Java的同学的福音。
最后,我也发现自己学习的不足:比如,虽然每节课都跟着老师的步骤来学习,但是学习的知识点很容易就会忘记。还有有时候遇到代码出现bug,不能独立寻找问题、解决问题,只能求助老师和同学,这些都表明自己学得还不够深入不够踏实。所以希望,在以后的学习中,能够不断进步,不断地完善自己学习上的缺点。
最后的最后是要感谢杜云梅老师的谆谆教诲,让我受益匪浅。希望以后能有机会在您的领导下学到更多技术。
二、总结Python+Flask+MysqL的web建设技术过程
1.首页——完成首页前端页面
无序列表
<ul style="list-style: none"> <li>Coffee</li> <li>Tea</li> <li>Milk</li> </ul>
2.首页功能——传递数据到前端页面
index(),传数据到index.html
def index(): context = {‘question‘: Question.query.all()} return render_template(‘index.html‘, **context)
Question.query.order_by(‘-creat_time‘).all()
3.首页功能——显示列表
index.html:
for 循环每一条数据
<ul> {% for foo in questions %} <li> <a href="#" >{{ foo.author.username }}</a> <a href="#">{{ foo.title }}</a> <span >{{ foo.creat_time }}</span> <p > {{ foo.detail }}</p> </li> {% endfor %} </ul>
4.问答详情页——主py文件
项目.py:
@app.route(‘/detail/<question_id>‘) def detail(question_id): quest = Question.query.filter(Question.id == question_id).first() return render_template(‘detail.html‘, ques = quest)
5.问答详情页——index.html
index.html:
<a href="{{ url_for(‘detail‘,question_id = foo.id) }}">{{ foo.title }}</a>
6.问答详情页——detail.html
detail.html布局:
<h3>{{ ques.id }}{{ ques.title}}<br> <small>{{ ques.creat_time }}{{ ques.author.username }} </small> </h3>
<p class="lead">{{ ques.detail }}</p>
7.评论——对象关系印射
对象关系印射:
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‘)) detail = db.Column(db.Text, nullable=False) question = db.relationship(‘Question‘,backref = db.backref(‘comments‘)) author = db.relationship(‘User‘,backref = db.backref(‘comments‘))
8.评论——视图函数
@app.route(‘/comment/‘,methods=[‘POST‘]) def comment(): comment = request.form.get(‘new_comment‘) ques_id = request.form.get(‘question_id‘) auth_id = User.query.filter(User.username == session.get(‘user‘)).first().id comm = Comment(author_id=auth_id, question_id=ques_id, detail=comment) db.session.add(comm) db.session.commit() return redirect(url_for(‘detail‘, question_id=ques_id))
9.评论——表单
<form action="{{ url_for(‘comment‘) }}" method="post" style="margin: 20px"> <div class="form-group"> <textarea name="new_comment" rows="3" placeholder="write your comment"></textarea> <input type="hidden" name="question_id" value="{{ ques.id }}"> </div> <button type="submit" class="btn btn-default">发送</button> </form>
10.评论——评论前登陆
def loginFirst(func): @wraps(func) def wrapper(*args,**kwargs): if session.get(‘user‘): return func(*args,**kwargs) else: return redirect(url_for(‘login‘)) return wrapper
11.评论——显示所有评论
<ul class="list-group" style="margin: 10px"> {% for foo in ques.comments %} <li class="list-group-item" > <span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span> <a href="#" >{{ foo.author.username }}</a> <span >{{ foo.creat_time }}</span> <p style="text-indent: 18px"> {{ foo.detail }}</p> </li> {% endfor %} </ul>
12.评论——所有评论排序
class Comment(db.Model): question = db.relationship(‘Question‘, backref=db.backref(‘comments‘, order_by=creat_time.desc)) question = db.relationship(‘Question‘, backref=db.backref(‘comments‘, order_by=id.desc))
13.评论——评论条数
反向引用:detail.html
评论:({{ ques.comments|length }})
index.html
评论:({{ foo.comments|length }})
14.个人中心——标签页导航
<ul class="nav_ul"> <li role="presentation"><a href="#">Home</a></li> <li role="presentation"><a href="#">Profile</a></li> <li role="presentation"><a href="#">Messages</a></li> </ul>
<ul>标签定义无序列表,li标签定义无序列表单/项。
同:<li role="presentation">与<a role="menuitem”></a>中role扮演角色是大同小异,即菜单列表单/项。
15.个人中心——父模板
{% extends ‘base.html‘ %} {% block title %}个人中心{% endblock %} {% block main %} <h3><span class="glyphicon glyphicon-user" aria-hidden="true"> </span>{{ user.username }}</h3> <ul class="nav nav-tabs"> <li role="presentation" ><a href="{{ url_for(‘usercenter‘,user_id = user.id,tag = 1) }}">全部问答</a></li> <li role="presentation"><a href="{{ url_for(‘usercenter‘,user_id = user.id,tag = 2) }}">全部评论</a></li> <li role="presentation"><a href="{{ url_for(‘usercenter‘,user_id = user.id,tag = 3) }}">个人资料</a></li> </ul> {% block user %} {% endblock %} {% endblock %}
16.个人中心——三个子页面
{% extends ‘user.html‘ %} {% block user %} <div> 全部问答 </div> {% endblock %}
{% extends ‘user.html‘ %} {% block user %} <div> 全部评论 </div> {% endblock %}
{% extends ‘user.html‘ %} {% block user %} <div> 个人信息 </div> {% endblock %}
17.个人中心——原视图函数与链接
@app.route(‘/usercenter/<user_id>‘) def usercenter(user_id): user = User.query.filter(User.id == user_id).first() context = {‘user‘: user } return render_template(‘usercenter.html‘, **context)
<ul class="nav_ul"> <li role="presentation"><a href="{{ url_for(‘usercenter‘,user_id=user.id ) }}">questions</a></li> <li role="presentation"><a href="#">comments</a></li> <li role="presentation"><a href="#">infomation</a></li> </ul>
<a href="{{ url_for(‘usercenter‘,user_id = foo.author_id) }}
18.个人中心——视图函数带标签页面参数
@app.route(‘/usercenter/<user_id>/<tag>‘) @login_re def usercenter(user_id, tag): user = User.query.filter(User.id == user_id).first() context = {‘user‘: user } if tag == ‘1‘: return render_template(‘usercenter1.html‘, **context) elif tag == ‘2‘: return render_template(‘usercenter2.html‘, **context) else: return render_template(‘usercenter3.html‘, **context)
19.个人中心——导航标签链接
个人中心父模板:
<ul class="nav nav-tabs"> <li role=“presentation”><a href=“{{ url_for(‘usercenter’,user_id = user.id,tag = ‘1’) }}">全部问答</a></li> <li role="presentation"><a href="{{ url_for(‘usercenter‘,user_id = user.id,tag = ‘2’) }}">全部评论</a></li> <li role="presentation"><a href="{{ url_for(‘usercenter‘,user_id = user.id,tag = ‘3’) }}">个人资料</a></li> </ul>
20.个人中心——有链接到个人中心页面
base.html:
<a href="{{ url_for(‘usercenter‘,user_id = session.get(‘userid‘), tag=1) }}">{{ session.get(‘user‘) }}</a>
index.hml:
<a href="{{ url_for(‘usercenter‘,user_id = foo.author_id, tag = 1) }}" >{{ foo.author.username }})</a>
detail.html:
<a href="{{ url_for(‘usercenter‘, user_id = ques.author_id, tag =1) }}" >{{ foo.author.username}}</a>
21.搜索功能——准备
.py文件:
@app.route(‘/search/‘) def search(): pass
base.html搜索框所在的:
<form action="{{ url_for(‘search‘) }}" method="get"> <input name="q" type="text" placeholder="请输入关键字">
22.搜索功能——视图函数
获取搜索关键词:
q = request.args.get(‘q’)
条件查询:
qu = Question.query.filter(Question.title.contains(q)).order_by(‘-creat_time’)
加载查询结果:
return render_template(‘index.html‘, question=qu)
23.搜索功能——组合条件查询
组合条件查询:
from sqlalchemy import or_ qu = Question.query.filter(or_(Question.title.contains(q), Question.detail.contains(q))).order_by(‘-creat_time‘)
24.密码保护
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(50))
from werkzeug.security import generate_password_hash, check_password_hash @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
登录:
def login(): if request.method == ‘GET‘: return render_template(‘login.html‘) else: username = request.form.get(‘username‘) password1 = request.form.get(‘password‘) user = User.query.filter(User.username == username).first() if user: if user.check_password(password1): session[‘userid‘] = user.id session.permanent = True return redirect(url_for(‘index‘)) else: return u‘password error‘ else: return u‘error username‘