一.个人学期总结
从一开始接触的是turtle库绘制图形,在没有接触基本语法的情况下,会因为基础不扎实而学起来吃力,turtle库的学习,练习if条件、for循环、定义函数的代码,激发了我们对python的学习兴趣的热情,逐渐的,在对库的使用中熟悉了python的语法,有html基础加上Bootstrap(www.runoob.com)的CSS引用,就可以制作出一个静态页面,再有了python基础以及连接数据库的知识,就可以完成web建站了。
Python的确易学、易用、强大。印证了Bruce Eckel的观点:“Python可能是唯一一种旨在帮助程序员把事情弄得更加简单的语言”,是一种“用着方便、看着舒服”的程序。在课堂上也经历了明明听懂了,可是课下一做,就什么都不会了,脑袋一片空白,没有一点思路,而且刚写了一点代码程序就会报错,所以多加练习还是很有必要的,有时候也要借鉴一下别人的学习方法。遇到问题先自己想,然后是上网查资料,再然后是问同学,最后是问老师。Flask框架相对于其他框架而言,更加稳定,不会有莫名其妙的错误,容错性强,运行效果好,报错信息明了。在本学期的管理系统课程中,我收获了以下编程习惯:
1.搜索能力:你没有能力和精力完成所有的事情,别人也不一定有时间帮你,有些时候需要自己去找答案,至少是找到灵感。所以学习从Google、CSDN等网站找到自己需要的东西是一个很好的习惯;
2.善用Python标准库;
3.尽能力熟悉常用的工具和项目。
二.总结Python+Flask+MysqL的web建设技术过程:
1.web建设过程中需要用到的工具:pycharm64.exe + Python 3.6 64-bit + MySQL + Navicat for MySQL(辅助工具)
2新建flask项目
3.创建连接数据库的名为config的py文件
import os DEBUG = True SECRET_KEY = os.urandom(24) DIALECT = 'mysql' DRIVER = 'mysqldb' USERNAME = 'root' PASSWORD = 'ROOT' HOST = 'localhost' DATABASE = 'mis_db' SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@localhost:3306/mis_db?charset=utf8' SQLALCHEMY_TRACK_MODIFICATIONS = False
4.在连接了数据库之后,就可以在另一个主py文件里创建基本表,包括
user表里存放用户的id、用户名、密码和昵称;
question表里存放用户的id、标题、问答详情、创建时间、作者id;
comment表里存放id、作者id、文章id、创建时间和问答详情。
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), nullable=True) class Ques(db.Model): __tablename__ = 'question' id = db.Column(db.Integer, primary_key=True, autoincrement=True) author_id = db.Column(db.Integer, db.ForeignKey('user.id')) author = db.relationship('User', backref=db.backref('question')) title = db.Column(db.String(20), nullable=False) detail = db.Column(db.Text, nullable=False) creat_time = db.Column(db.DateTime, default=datetime.now) 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')) creat_time = db.Column(db.DateTime, default=datetime.now) detail = db.Column(db.Text, nullable=False) question = db.relationship('Ques', backref=db.backref('comment', order_by=creat_time.desc)) author = db.relationship('User', backref=db.backref('comment'))
db.create_all()
5.数据库增删改查
#增加 user=User(username='lulu',password='11111',nickname='123456') db.session.add(user) db.session.commit() #查询 user=User.query.filter(User.username =='lulu').first() print(user.username,user.password,user.nickname) #删除 user=User.query.filter(User.username =='lulu').first() db.session.delete(user) db.session.commit() #修改 user=User.query.filter(User.username =='lulu').first() user.password='123456789' db.session.commit()
6.加载静态文件和模板继承
加载静态文件:
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <link type="text/css" rel="stylesheet" href="{{ url_for('static',filename='css/all.css') }}">
子模板继承:
a.注册
{% extends 'lx3.html' %} {% block registertitle %}注册{% endblock %} {% block registerhead %} <script type="text/javascript" src="../static/js/all.js"></script>{% endblock %}
b.登录
{% extends 'lx3.html' %} {% block logintitle %}登录{% endblock %} {% block loginhead %}<script type="text/javascript" src="../static/js/all.js"></script>{% endblock %}
c.发布问答
{% extends 'lx3.html' %} {% block registertitle %}发布{% endblock %}
d.个人中心父模板
{% extends"lx3.html" %} {% block logintitle %}个人中心{% endblock %} {% block loginhead %} {% endblock %}
e.个人中心
{% extends 'user.html' %} {% block user %}个人信息{% endblock %}
7.首页功能
.py文件
#首页 @app.route('/') def lx(): context = { 'question': Ques.query.all() }
html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页 {% block logintitle %}{% endblock %} {% block registertitle %}{% endblock %} </title> <nav style="background-color: white"> <ul class="nav nav-tabs"> <li><a href="{{ url_for('lx') }}">首页</a></li> <li><a href="{{ url_for('fabu') }}">发布菜谱</a></li> <ul class="nav navbar-nav navbar-right"> {% if username %} <li><a href="{{url_for('logout') }}"><span class="glyphicon glyphicon-user"></span> 注销</a></li> <li><a href=""><span class="glyphicon glyphicon-log-in"></span> {{username }}</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 %} </ul> <form action="{{ url_for('search') }}" class="navbar-form navbar-left" role="search"method="get"> <div class="form-group"><input type="text" name="search" class="form-control" placeholder="请输入关键词"> <button type="submit" class="btn btn-default" style="width: 70px">Search</button></div> </form> </ul> </nav> {% block loginhead %}{% endblock %} {% block registerhead %}{% endblock %} <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <link type="text/css" rel="stylesheet" href="{{ url_for('static',filename='css/all.css') }}"> </head> <script src="https://cdn.bootcss.com/bootstrap/4.0.0-beta/js/bootstrap.min.js"></script> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> <body class="body"> <h1 align="center">美食天下</h1> {% block body %} <div class="container"> <div class="row clearfix"> <div class="col-md-2 column"> </div> <div class="col-md-8 column"> {% for foo in question %} <div class="list-group"> <a href="{{ url_for('usercenter',user_id=foo.author.id,tag='1') }}" class="list-group-item active">作者:{{ foo.author.username}}</a> <div class="list-group-item"> <a href="{{ url_for('detail',question_id=foo.id)}}" class="list-group-item-heading"> {{ foo.title}} </a> <p class="list-group-item-text"> {{foo.detail}} </p> </div> <div class="list-group-item"> <span class="badge">发布时间:{{foo.creat_time}}</span> 发布时间 </div> </div> {% endfor %} <div class="col-md-2 column"> </div> </div> </div> <div class="row"> <div class="col-md-1"></div> <div class="col-md-2"> </br></br></br> <div class="list-group"> <a href="#" class="list-group-item active"> Introduction </a> <a href="http://www.meishij.net/zuofa/liangbanjisi_27.html" class="list-group-item list-group-item-action">凉拌鸡丝</a> <a href="http://www.meishij.net/zuofa/bawangchaoshiluandunzhizhuroufentiao.html" class="list-group-item list-group-item-action">霸王乱炖之猪肉粉条</a> <a href="http://www.meishij.net/zuofa/bingcaotianchengshalaqiubishalajiang.html" class="list-group-item list-group-item-action">冰草甜橙沙拉</a> <a href="http://www.meishij.net/zuofa/pugongyingyumibing.html" class="list-group-item list-group-item-action ">蒲公英玉米饼</a> <a href="http://www.meishij.net/zuofa/shengdanhuahuanpaofu.html" class="list-group-item list-group-item-action ">圣诞花环泡芙</a> <a href="http://www.meishij.net/zuofa/wanghongzangzangbao_2.html" class="list-group-item list-group-item-action ">网红脏脏包</a> </div> </div> <div class="col-md-1"></div> <div class=" col-md-3"> <a href="http://www.meishij.net/zuofa/liangbanjisi_27.html" > <img src="{{ url_for('static',filename='images/jisi.jpg') }}" height="40%" width="90%"> </a> <a href="http://www.meishij.net/zuofa/liangbanjisi_27.html" ><h3 class="text-muted"><font color="white">凉拌鸡丝</font></h3></a> <p class="text-muted"><font color="FFF7FF">鸡的肉质细嫩,滋味鲜美,适合多种烹调方法,并富有营养,有滋补养身的作用。肌肉不但适合热炒、炖汤,而且是比较适合冷食凉拌的肉类。今天就和大家一起分享这道极为简单的凉拌小菜,只需将鸡肉煮熟后撕成细丝,再浇上料汁即可享用 </font></p> <p><a href="http://www.meishij.net/zuofa/liangbanjisi_27.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/?q=鸡丝" class="btn btn-default" role="button">more</a></p> </div> <div class=" col-md-3"> <a href="http://www.meishij.net/zuofa/bawangchaoshiluandunzhizhuroufentiao.html" > <img src="{{ url_for('static',filename='images/mian.jpg') }}" height="40%" width="90%"> </a> </br> <a href="http://www.meishij.net/zuofa/bawangchaoshiluandunzhizhuroufentiao.html" ><h3 class="text-muted"><font color="white">霸王乱炖之猪肉粉条</font></h3></a> <p class="text-muted"><font color="white">吃惯了精致的小菜,偶尔吃吃粗旷的炖菜也不错,最家常最简单的乱炖,同时也是最美味最下饭的乱炖。砂锅里各色食材放得满满当当,小火慢炖,砂锅边缘蒸腾出一丝丝热气。大块吃肉解馋,粉条吸足了肉的香味鲜香爽滑,配上米饭味美.</font> </p> <p><a href="http://www.meishij.net/zuofa/bawangchaoshiluandunzhizhuroufentiao.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/index.php?q=猪肉粉条" class="btn btn-default" role="button">more</a></p> </div> </div> <div class="row"> <div class="col-md-4"></div> <div class=" col-md-3"> </br></br> <a href="http://www.meishij.net/zuofa/bingcaotianchengshalaqiubishalajiang.html" > <img src="{{ url_for('static',filename='images/sala.jpg') }}" height="40%" width="90%"></a> <a href="http://www.meishij.net/zuofa/bingcaotianchengshalaqiubishalajiang.html" ><h3 class="text-muted"><font color="white">冰草甜橙沙拉</font></h3></a> <p class="text-muted"><font color="white">第一次尝试丘比的青柠味的沙拉酱,比起之前用其它口味,口感更清新,更爽味,微甜而不腻。搭配了冰草,樱桃番茄,甜橙,做成口味微甜的沙拉,吃起来相当爽口。冰草脆而多汁,与甜橙和樱桃番茄在一起组成红黄绿亮眼的三色,非常养眼而美味。</font></p> <p><a href="http://www.meishij.net/zuofa/bingcaotianchengshalaqiubishalajiang.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/index.php?q=沙拉" class="btn btn-default" role="button">more</a></p> </div> <div class=" col-md-3"> </br></br> <a href="http://www.meishij.net/zuofa/pugongyingyumibing.html" > <img src="{{ url_for('static',filename='images/yumi.jpg') }}" height="40%" width="90%"> </a> <a href="http://www.meishij.net/zuofa/pugongyingyumibing.html" ><h3 class="text-muted"><font color="white">蒲公英玉米饼</font></h3></a> <p class="text-muted"><font color="white">蒲公英具有清热解毒,解除消化不良和便秘,清净血液的功效,含有丰富的维生素和矿物质,除了当馅料包饺子,还能做咸粥,其本身带有一种清爽的口感,又具有丰富的食疗效果。这里花儿就和您分享用蒲公英做的特别好吃的一种主食:蒲公英贴饼子。</font></p> <p><a href="http://www.meishij.net/zuofa/pugongyingyumibing.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/index.php?q=玉米饼" class="btn btn-default" role="button">more</a></p> </div> </div> <div class="row"> <div class="col-md-4"></div> <div class=" col-md-3"> </br></br> <a href="http://www.meishij.net/zuofa/shengdanhuahuanpaofu.html" > <img src="{{ url_for('static',filename='images/paofu.jpg') }}" height="40%" width="90%"></a> <a href="http://www.meishij.net/zuofa/shengdanhuahuanpaofu.html" ><h3 class="text-muted"><font color="white">圣诞花环泡芙</font></h3></a> <p class="text-muted"><font color="white">罐头小厨、火鸡、蛋糕、翻糖饼干堪称圣诞老三样,今年来点不一样!这款圣诞花环泡芙,美味和颜值全天在线,美妙的奶香和糖霜让人心神荡漾,隔着屏幕都能闻到甜甜的味道呢</font></p> <p><a href="http://www.meishij.net/zuofa/shengdanhuahuanpaofu.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/index.php?q=泡芙" class="btn btn-default" role="button">more</a></p> </div> <div class="row"> <div class="col-md-4"></div> <div class=" col-md-3"> </br></br> <a href="http://www.meishij.net/zuofa/wanghongzangzangbao_2.html" > <img src="{{ url_for('static',filename='images/zangbao.jpg') }}" height="40%" width="90%"></a> <a href="http://www.meishij.net/zuofa/wanghongzangzangbao_2.html" ><h3 class="text-muted"><font color="white">网红脏脏包</font></h3></a> <p class="text-muted"><font color="white">脏脏包是一款起酥面包,一时间卖得火爆,很多店铺都断货。它里面包有香醇的巧克力馅,外表淋上一层巧克力酱,再撒上可可粉,入口的一瞬间略有点微苦,口感酥软,甜而不腻。</font></p> <p><a href="http://www.meishij.net/zuofa/wanghongzangzangbao_2.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/index.php?q=脏脏包" class="btn btn-default" role="button">more</a></p> </div> </div> {% endblock %} </body> </html>
8.完成注册和登录功能
a.注册与登录js页面。onclick函数return True时才提交表单,return False时不提交表单。
function denglu() { var oUname = document.getElementById("user") var oError = document.getElementById("error_box") var oUpass = document.getElementById("upass") var isError = true; oError.innerHTML = "<br>" if (oUname.value.length > 12 || oUname.value.length < 6) { oError.innerHTML = "用户名至少6-12位"; isError = false; return isError; } else if (oUname.value.charCodeAt(0) >= 48 && oUname.value.charCodeAt(0) <= 57) { oError.innerHTML = "用户名必须为字母"; isError = false; return isError; } else for (var i = 0; i < oUname.value.length; i++) { if ((oUname.value.charCodeAt(i) < 48 || oUname.value.charCodeAt(i) > 57) && (oUname.value.charCodeAt(i) < 97 || oUname.value.charCodeAt(i) > 122)) { oError.innerHTML = "only letter or number"; isError = false; return isError; } } if (oUpass.value.length > 20 || oUpass.value.length < 6) { oError.innerHTML = "密码为 6-20位字符"; isError = false; return isError; } window.alert("登录成功") return true; } function zhuce() { var oPass = document.getElementById("upass"); var oPass1 = document.getElementById("upass1"); var oUname = document.getElementById("uname"); var oError = document.getElementById("error_box") var isError = true; oError.innerHTML = "<br>" if (oUname.value.length < 6 || oUname.value.length > 12) { oError.innerHTML = "用户名6-12位"; isError = false; return isError; } else if ((oUname.value.charCodeAt(0) >= 48) && (oUname.value.charCodeAt(0) <= 57)) { oError.innerHTML = "首位为英文"; isError = false; return isError; } else for (var i = 0; i < oUname.value.length; i++) { if (((oUname.value.charCodeAt(i) < 48) || (oUname.value.charCodeAt(i) > 57)) && ((oUname.value.charCodeAt(i) < 97) || (oUname.value.charCodeAt(i) > 122))) { oError.innerHTML = "字母或数字"; isError = false; return isError; } } if ((oPass.value.length < 6 || oPass.value.length > 12)&&(oPass != oPass1)) { oError.innerHTML = "密码输入错误"; isError = false; return isError; } window.alert("注册成功") return true; }
b.注册页面的.py文件
@app.route('/regist', methods=['GET', 'POST']) def regist(): if request.method == 'GET': return render_template('lx.html') else: username = request.form.get('username') password = request.form.get('password') user = User.query.filter(User.username == username).first() # 判断用户名是否存在 if user: return u'账号已存在' else: user = User(username=username, password=password) db.session.add(user) db.session.commit() return redirect(url_for('login'))
注册页面的html文件
{% extends 'lx3.html' %} {% block registertitle %}注册{% endblock %} {% block registerhead %} <script type="text/javascript" src="../static/js/all.js"></script>{% endblock %} <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="../static/css/all.css"> <base href="www.gzcc.cn" target="_blank"> <h1> 注册界面 </h1> <body id="myBody"> {% block body %} <div class="bigdiv" id="container"> <div id="header"><h2 align="center">注册</h2></div> <div id="content"> <form action="{{ url_for('regist') }}" method="post"> <div align="center"> 账号注册:<input id="uname" type="text" name="username" placeholder="请输入用户名"><br></div> <div align="center"> 注册密码:<input id="upass" type="password" name="password" placeholder="请输入密码"><br> </div> <div align="center"> 确认密码:<input id="upass1" type="password" name="password1" placeholder="请确认密码"></div> <div align="center"><input type="radio" name="role" value="stu">student <input type="radio" name="role" value="tea">teacher <br> <div> <button type="submit" onclick="return zhuce()">注册</button> <input type="button" value="cancel"><br> </div> </div> <div align="center"> <div id="error_box"></div> <br> </div> </form> </div> </div> </body> {% endblock %} </html>
c.登录页面的.py文件
@app.route('/login/', methods=['GET', 'POST']) def login(): if request.method == 'GET': return render_template('lx2.html') else: username = request.form.get('username') password = request.form.get('password') user = User.query.filter(User.username == username).first() # 判断用户名是否存在 if user: if user.check_password(password): session['user'] = username session['userid']=user.id session.permanent = True return redirect(url_for('lx')) else: return u'密码错误' else: return u'账号不存在'
登录页面的html文件
{% extends 'lx3.html' %} {% block logintitle %}登录{% endblock %} {% block loginhead %}<script type="text/javascript" src="../static/js/all.js"></script>{% endblock %} <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="../static/css/all.css" > <h1> 用户界面 </h1> <div class="col"> <body class="body"> {% block body %} <script> function displayDate() { document.getElementById("demo").innerHTML=Date(); } </script> <p id="demo">what is the time?</p> <button type="button" onclick="displayDate()">显示日期</button> <div class="bigdiv" > <div id="header" ><h2 align="center">登录</h2></div> <div id="content"> <form action="{{ url_for('login')}}"method="post"> <div align="center">username:<input id="user" type="text" name="username" placeholder="请输入用户名" ></div> <br> <div align="center"> password:<input id="upass" type="password" name="password" placeholder="请输入密码" align="center"><br></div> <div align="center"> <input type="radio" name="role" value="stu">student <input type="radio" name="role" value="tea">teacher <br> <input type="checkbox" value="true"><span style="color: blueviolet">rember</span> <a href="www.gzcc.cn"> 登录问题请点</a></div> <br> <div align="center"> <button type="submit" onclick=" return fuck()">登录</button> <input type="button" value="cancel"><br> </div> <div align="center"> <div id="error_box"></div><br> </div> </form> </div> </div> {% endblock %} </div> </body> </html>
9.注销功能
@app.route('/logout') def logout(): session.clear() return redirect(url_for('lx'))
10.发布菜谱功能
.py文件
@app.route('/fabu', methods=['GET', 'POST']) @loginFirst def fabu(): if request.method == 'GET': return render_template('fabu.html') else: title = request.form.get('title') detail = request.form.get('detail') author_id = User.query.filter(User.username == session.get('user')).first().id # 判断用户名是否存在 question = Ques(title=title, detail=detail, author_id=author_id) db.session.add(question) db.session.commit() return redirect(url_for('lx'))
.html文件
{% extends 'lx3.html' %} {% block registertitle %}发布{% endblock %} {% block registerhead %}<script type="text/javascript" src="../static/js/all.js"></script>{% endblock %} <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="../static/css/all.css" > <base href="www.gzcc.cn"target="_blank"> <body> {% block body %} <div class="bigdiv"> <h2>发布菜谱</h2> <form action="{{ url_for('fabu') }}" method="post"> <label for="">标题</label> <textarea name="title" id="title" cols="50" rows="1"></textarea><br> <label for="">内容</label> <textarea name="detail" id="detail" cols="50" rows="10"></textarea><br> <div align="center"><button type="submit">发布</button></div> </form> </div> {% endblock %} </body> </html>
11.问答详情及发布评论功能
.py文件
@app.route('/detail/<question_id>', methods=['GET', 'POST']) def detail(question_id): quest = Ques.query.filter(Ques.id == question_id).first() comments = Comment.query.filter(Comment.question_id == question_id).all() return render_template('detail.html', quest=quest,comments=comments) @app.route('/comment',methods=['POST']) @loginFirst def comment(): comment =request.form.get('new_comment') question_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=question_id,detail=comment) db.session.add(comm) db.session.commit() return redirect(url_for('detail',question_id=question_id))
.html文件
{% extends 'lx3.html' %} {% block registertitle %} 内容{% endblock %} {% block registerhead %} <script type="text/javascript" src="../static/js/all.js"></script>{% endblock %} <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="../static/css/all.css"> <base href="www.gzcc.cn" target="_blank"> {% block body %} <div class="container" align=""> <div class="row clearfix"> <div class="col-md-3 column"> </div> <div class="col-md-6 column"> <h3 align="center">{{ quest.title }}</h3> <div align="center" style="font-weight: 900 "> {# <span style="color: red">作者:{{ quest.author.username }} 时间:{{ quest.creat_time }}</span>#} <span class="badge">作者:{{ quest.author.username }} 发布时间:{{ quest.creat_time }}</span> </div> <div class="panel panel-default"> <div class="panel-body" style="font-size:large"> {{ quest.detail }} </div> </div> <h4>评论:({{ quest.comment|length }})</h4> {% for foo in comments %} <div class="panel panel-default"> <div class="panel-body"> <span><a href="{{ url_for('usercenter',user_id=foo.author.id,tag='1') }}">{{ foo.author.username }}</a> 时间:{{ foo.creat_time }}</span><br> <span style="font-size: medium"> {{ foo.detail }}</span> </div> </div> {% endfor %} <h4>发布评论</h4> <div> <form action="{{ url_for('comment') }}" method="post"> <textarea name="new_comment" id="new_comment" cols="90" rows="5"></textarea> <input id="question_id" name="question_id" type="hidden" value="{{ quest.id }}"> <button type="submit">发布</button> </form> </div> <div class="col-md-3 column"> </div> </div> </div> </div> {% endblock %}
11.个人中心功能
.py文件
@app.route('/usercenter/<user_id>/<tag>') @loginFirst def usercenter(user_id,tag): user=User.query.filter(User.id==user_id).first() context={ 'username_id': user.id, 'username':user.username, 'questions':user.question, 'comments':user.comment } if tag == '1': return render_template('usercenter.html',**context) elif tag == '2': return render_template('all_question.html', **context) else: return render_template('all_comment.html', **context)
.html文件
{% extends"lx3.html" %} {% block logintitle %}个人中心{% endblock %} {% block loginhead %} <style> .nav_ul li{ list-style: none; float: left; margin: 10px; } </style> {% endblock %} {% block body %} <ul class="nav_ul"> <li role="presentation"><a href="{{ url_for('usercenter',user_id = username_id,tag='2') }}">全部问答</a></li> <li role="presentation"> <a href="{{ url_for('usercenter',user_id = username_id,tag='3') }}">全部评论</a></li> <li role="presentation"><a href="{{ url_for('usercenter',user_id = username_id,tag='1') }}">个人信息</a></li> </ul> {% block user %}{% endblock %} {% endblock %}
全部问答.html
{% extends 'user.html' %} {% block user %} <div class="container"> <div class="row clearfix"> <div class="col-md-2 column"> </div> <div class="col-md-8 column" id="rgba1"> <hr> <h3 align="center"> <small>全部问答</small> </h3> <ul class="list-unstyled"> {% for foo in questions %} <li class="list-group-item"> <span class="glyphicon glyphicon-user"></span><a>{{ foo.author.username }}</a> <p><a href="{{ url_for('detail',question_id=foo.id)}}">标题:{{ foo.title }}</a></p> <span class="badge pull-right">{{ foo.create_time }}</span> <p>问答内容:{{ foo.detail }}</p> <br> </li> {% endfor %} </ul> </div> <div class="col-md-2 column"> </div> </div> </div> {% endblock %}
全部评论.html
{% extends 'user.html' %} {% block user %} <div class="container"> <div class="row clearfix"> <div class="col-md-2 column"> </div> <div class="col-md-8 column" id="rgba1"> <hr> <h3 align="center"> <small>全部评论</small> </h3> <ul class="list-unstyled"> {% for foo in comments %} <li class="list-group-item"> <span class="badge pull-right">{{ foo.create_time }}</span> <p>文章标题:{{ foo.question.title }}</p> <p>评论内容:{{ foo.detail }}</p> <span class="glyphicon glyphicon-user"></span><small ><a>{{ foo.author.username }}</a></small> <br> </li> {% endfor %} </ul> </div> <div class="col-md-2 column"> </div> </div> </div> {% endblock %}
个人信息.html
{% extends 'user.html' %} {% block user %} <div class="container"> <div class="row clearfix"> <div class="col-md-2 column"> </div> <div class="col-md-8 column" id="rgba1"> <p class="text-center"> <small>{{ username }}</small> </p> <hr> <h3 align="center"> <small>个人信息</small> </h3> <ul class="list-group"> <li class="list-group-item" style="background-color: antiquewhite"><span class="glyphicon glyphicon-user"></span>用户:{{ username }}</li> <li class="list-group-item" style="background-color: wheat">昵称</li> <li class="list-group-item" style="background-color: aquamarine">文章篇数:{{ questions|length }}</li> </ul> </div> <div class="col-md-2 column"> </div> </div> </div><br> {% endblock %}
13.搜索功能
.py文件
@app.route('/search/',methods=['GET','POST']) def search(): search = request.args.get('search') question = Ques.query.filter( or_( Ques.title.contains(search), Ques.detail.contains(search) ) ).order_by('-creat_time') return render_template('lx3.html',question=question)
14.装饰器
decorator装饰器,它能增强函数的功能,它是一个函数,它的参数是一个函数,返回值是一个函数
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
15.上下文处理器
@app.context_processor def mycontext(): username = session.get('user') if username: return {'username': username} else: return {}
编程是一门技术,也可以说是一门手艺。如同书法、绘画、乐器、雕刻等,技艺纯熟的背后一定付出了很长的时间去反复练习。编程的世界浩瀚无边,所以应保持一颗敬畏的心态去学习,认真对待写下的每一行代码,甚至每一个字符。总体来说,在老师的指导下,我学到了很多东西。