一.我的學期總結javascript
從一開始接觸的是turtle庫繪製圖形,在沒有接觸基本語法的狀況下,會由於基礎不紮實而學起來吃力,turtle庫的學習,練習if條件、for循環、定義函數的代碼,激發了咱們對python的學習興趣的熱情,逐漸的,在對庫的使用中熟悉了python的語法,有html基礎加上Bootstrap(www.runoob.com)的CSS引用,就能夠製做出一個靜態頁面,再有了python基礎以及鏈接數據庫的知識,就能夠完成web建站了。php
Python的確易學、易用、強大。印證了Bruce Eckel的觀點:「Python多是惟一一種旨在幫助程序員把事情弄得更加簡單的語言」,是一種「用着方便、看着舒服」的程序。在課堂上也經歷了明明聽懂了,但是課下一作,就什麼都不會了,腦殼一片空白,沒有一點思路,並且剛寫了一點代碼程序就會報錯,因此多加練習仍是頗有必要的,有時候也要借鑑一下別人的學習方法。遇到問題先本身想,而後是上網查資料,再而後是問同窗,最後是問老師。Flask框架相對於其餘框架而言,更加穩定,不會有莫名其妙的錯誤,容錯性強,運行效果好,報錯信息明瞭。在本學期的管理系統課程中,我收穫瞭如下編程習慣:css
1.搜索能力:你沒有能力和精力完成全部的事情,別人也不必定有時間幫你,有些時候須要本身去找答案,至少是找到靈感。因此學習從Google、CSDN等網站找到本身須要的東西是一個很好的習慣;html
2.善用Python標準庫;java
3.盡能力熟悉經常使用的工具和項目。python
二.總結Python+Flask+MysqL的web建設技術過程:mysql
1.web建設過程當中須要用到的工具:pycharm64.exe + Python 3.6 64-bit + MySQL + Navicat for MySQL(輔助工具)jquery
2新建flask項目程序員
3.建立鏈接數據庫的名爲config的py文件web
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 {}
編程是一門技術,也能夠說是一門手藝。如同書法、繪畫、樂器、雕刻等,技藝純熟的背後必定付出了很長的時間去反覆練習。編程的世界浩瀚無邊,因此應保持一顆敬畏的心態去學習,認真對待寫下的每一行代碼,甚至每個字符。整體來講,在老師的指導下,我學到了不少東西。