在本學期中在missdu的帶領下,咱們學習了管理信息系統python這一課程,在這個課程中我發現,跟隨老師的步伐,在學習Python+Flask+MysqL的web建設時,咱們安裝了mySQL,pycharm和一些python的第三方庫,一開始接觸python咱們學的是簡單的輸出輸入交互和一些數字的計算,python語言優勢在於它的簡潔靈活,接着咱們瞭解turtle庫(海龜庫),在此環境中練習條件、循環、函數定義的代碼敲打,並畫出了五角星、同心圓、太陽花、中國國旗等。隨後便學習了字符串的基本操做,學會輸入字符串,輸出代碼計算後的結果。還學習了凱撒密碼、GDP格式化輸出、九九乘法表等簡單操做。利用python進行英文詞彙統計,組合數據類型練習,用文件形式實現完成的英文詞頻統計、中文詞頻統計。利用datetime處理日期和時間,將字符串轉化成imestamp與timedelta,同時瞭解管理信息系統概念與基礎,理解數據存儲的方式如字典、列表、元祖、集合,瞭解到Web是圖形化的和易於導航的、與平臺無關、是分佈式的、是動態的、是交互的。雖然語句都挺簡單,但這激發了咱們對學習python的興趣,並提高了咱們對編程語言的思惟能力,有助於下半學期咱們構建Flask框架製做網頁的學習。html
學習初期第一方面,我認爲學習每一知識點的開始則是瞭解其知識點的概念及基礎。首先則是認識URL,觀察那些經常使用網站的網址,區分它們不一樣組成部分。而後,觀察web的瀏覽過程。最後,最爲重要的則是實操,瞭解HTML基礎並聯系使用標籤製做最簡單的頁面。自行了解各個標籤的用法以及總體標籤的規範。第二方面,認識div塊與form表單的做用,利用div塊與form表單製做登陸頁面。同時,練習使用各類列表,例以下拉列表選擇框、無序列表、有序列表以及定義列表。 觀察經常使用網頁的HTML元素,並在實操過程當中,用已學的標籤模仿製做。經過網絡搜索補充本身所想要的知識點,不要僅僅依賴於課堂。python
開始Flask項目,加載靜態文件,父模板的繼承和擴展,鏈接mysql數據庫,建立用戶模型,創建mysql和app的鏈接。經過用戶模型,對數據庫進行增刪改查操做。完成註冊功能,將界面的數據存到數據庫,redirect重定向登陸頁。完成登陸功能,用session記住用戶名,像操做字典同樣操做‘session’:增長用戶名‘session[‘username’]’=username。登陸以後更新導航,用上下文處理器app_context_processor定義函數,獲取session中保存的值,返回字典,在父模板中更新導航,插入登陸狀態判斷代碼。完成註銷功能,清除session。發佈功能的實現,製做首頁的顯示列表,首頁列表顯示所有問答,完成問答詳情頁佈局,從首頁問答標題到問答詳情頁,完成評論功能,完成評論列表顯示及排序,我的中心顯示,我的中心標籤頁導航,完成我的中心—導航標籤,實現搜索功能(包括高級搜索等),最重要的是實現密碼加密功能,還有模型分離與數據遷移,使代碼更簡潔更有保存用戶的肯定狀態。mysql
python,是一種面向對象的解釋型計算機程序設計語言,具備豐富和強大的庫。Python語法簡潔清晰,特點之一是強制用空白符(white space)做爲語句縮進。Flask是一個面向簡單需求小型應用的「微框架(microframework)」,Flask選擇組件的額外工做給那些使用案例不適用標準ORM的開發者提供了更多的靈活性,一樣也給使用不一樣工做流和模版化系統的開發者們帶來了靈活性。MySQL是一個關係型數據庫管理系統,MySQL 是最流行的關係型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係數據庫管理系統) 應用軟件。MySQL是一種關係數據庫管理系統,關係數據庫將數據保存在不一樣的表中,而不是將全部數據放在一個大倉庫內,這樣就增長了速度並提升了靈活性。MySQL所使用的 SQL 語言是用於訪問數據庫的最經常使用標準化語言。web
學習了python+flask web開發,感受計算機語言仍是有一點樂趣的,不至於很是枯燥無味的我覺的本身真正的學到了東西,重新手到會獨立完成本身的項目,過程當中遇到不少問題,查閱資料,問同窗以後都解決了, 雖然這個學期python課程學習結束了,可是對於我來講學習的程度不會止於此,我還要繼續學習python語言,由於這門語言對我來講吸引力很大,能夠做爲之後專門發展的方向,我以爲本身在語言方面還不夠規範跟熟練,還要繼續增強學習。sql
主要工具備:pycharm 、 MySQL 數據庫
建立數據庫mis_db編程
db.create_all() # 測試是否鏈接成功
(1)、導航條和註冊界面flask
# 註冊。
@app.route('/zhuce/', methods=['GET', 'POST']) # methods定義它有兩種請求方式,由於它在表單的請求是post,相似咱們在idea中的sava請求模式
def zhuce():
if request.method == 'GET':
return render_template('zhuce.html')
else:
username = request.form.get('user') # post請求模式,安排對象接收數據
password = request.form.get('pass')
nickname = request.form.get('nickname')
user = User.query.filter(User.username == username).first() # 做查詢,並判斷
if user:
return u'該用戶已存在'
else:
user = User(username=username, password=password, nickname=nickname) # 將對象接收的數據賦到User類中,即存到數據庫
db.session.add(user) # 執行操做
db.session.commit()
return redirect(url_for('denglu')) # redirect重定向
用戶名和密碼只能 6—20位功能網絡
密碼不一致功能 session
(2)、登陸界面
# 登陸。
@app.route('/denglu/', methods=['GET', 'POST']) # methods定義它有兩種請求方式
def denglu():
if request.method == 'GET':
return render_template('denglu.html')
else:
username = request.form.get('user') # post請求模式,安排對象接收數據
password1 = request.form.get('pass')
user = User.query.filter(User.username == username).first() # 做查詢,並判斷
if user: # 判斷用戶名
if user.check_password(password1): # 判斷密碼
session['user'] = username # 利用session添加傳回來的值username
session.permanent = True # 設置session過時的時間
return redirect(url_for('daohang'))
else:
return u'用戶密碼錯誤'
else:
return u'用戶不存在,請先註冊'
用戶名和密碼只能6—20位功能
(3)、發佈問答界面
# 發佈。
@app.route('/fabu/', methods=['GET', 'POST']) # methods定義它有兩種請求方式
@loginFirst # 將decorator定義的加強函數放在待加強函數定義的上面
def fabu():
if request.method == 'GET':
return render_template('fabu.html')
else:
title = request.form.get('title') # post請求模式,安排對象接收數據
detail = request.form.get('detail')
author_id = User.query.filter(
User.username == session.get('user')).first().id # 將session get到的user進行查詢並取出id放到外鍵author_id中
fabu = Fabu(title=title, detail=detail, author_id=author_id) # 將對象接收的數據賦到Fabu類中,即存到數據庫
db.session.add(fabu) # 執行操做
db.session.commit() # 提交到數據庫
return redirect(url_for('daohang')) # redirect重定向
(4)、評論頁面
# 評論
@app.route('/comment/', methods=['POST'])
@loginFirst
def comment():
detail = request.form.get('pinglun')
author_id = User.query.filter(User.username == session.get('user')).first().id
fabu_id = request.form.get('hidden_id')
comment = Comment(detail=detail, author_id=author_id, fabu_id=fabu_id)
db.session.add(comment) # 執行操做
db.session.commit() # 提交到數據庫
return redirect(url_for('detail', question_id=fabu_id))
(5)、我的中心界面
# 我的中心 @app.route('/usercenter/<user_id>/<tag>') @loginFirst def usercenter(user_id, tag): user = User.query.filter(User.id == user_id).first() context = { 'user_id': user.id, 'username': user.username, 'fabus': user.fabu, 'comments': user.comments } 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)
(6)、搜索界面
# 搜索
@app.route('/search/')
def search():
qu = request.args.get('q')
ques = Fabu.query.filter(
or_(
Fabu.title.contains(qu),
Fabu.detail.contains(qu)
)
).order_by('-creat_time')
return render_template('daohang.html', fabus=ques)
(7)、圖片區界面
# 圖片。
@app.route('/tupian/')
def tupian():
return render_template('tupian.html')
(8)、修改密碼界面
# 修改密碼 @app.route('/xiugai/<user_username>',methods=['GET','POST']) def xiugai(user_username): user=User.query.filter(User.username==user_username).first() if request.method == 'GET': return render_template('xiugai.html',user=user) else: password=user.password=request.form.get('password') db.update(password) db.session.commit() return redirect(url_for('denglu'))
(9)、設置界面
<ul class="dropdown-menu"> <li><a href="{{ url_for('fabu') }}">繼續發佈</a></li> <li><a href="{{ url_for('tupian') }}">上傳圖片</a></li> </ul>
點擊「繼續發佈」會跳轉發布界面,點擊「上傳圖片」會跳轉圖片區界面
'''
# 插入功能
user = User(username='15',password='12')
db.session.add(user)
db.session.commit()
# 查詢功能
user=User.query.filter(User.username=="15").first()
print(user.username,user.password)
# 修改功能
user=User.query.filter(User.username=="15").first()
user.password='888'
db.session.commit()
# 刪除功能
user=User.query.filter(User.username=="15").first()
db.session.delete(user)
db.session.commit()
'''
from werkzeug.security import generate_password_hash,check_password_hash
_password = db.Column(db.String(200), nullable=False) # 內部使用
# 定義屬性 password:
@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
import os
DEBUG = True
SECRET_KEY = os.urandom(24)
DIALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = 'root'
PASSWORD = 'ROOT'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'mis_db'
# 配置和數據庫的鏈接信息
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@localhost/mis_db?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = False