發表文章

本站已搬家!

本站已搬家至https://blog.typeart.cc


歡迎舊雨新知指教!

本站已正式搬家!

本站已搬家至 https://blog.typeart.cc 歡迎舊雨新知指教!

django Tutorial 筆記

django Tutorial 筆記 前言 Python除了寫爬蟲、小工具方便又快速之外,其中最有名的,就是做為網頁後端使用的django了!花了點時間跟著官方的tutorial試做一次,記錄自己容易忘記的地方 筆記 django自帶admin系統,可以很迅速產生針對資料庫的普通操作。在開發過程的測試中可以少下許多sql指令。上線後,也可以針對admin系統增加功能,省下開發後台管理介面的時間。等行有餘力再針對後台美化或製作自己想要的管理介面 django中,application與app的差異: application:指的是整個web服務,包住整個網頁服務。需要外加什麼、設定什麼都由這份django application提供 app:即底下的各服務、api…等。你隨時都可以因需求抽換細部功能。比如登入系統由vue框架轉成angular,開發完畢後抽換此區塊即可 根目錄下的manage.py是所有指令的起點,常用指令如下: python manage . py runserver #啟動服務 python manage . py createsuperuser # 建立管理員帳號,可在/admin site登入 python manage . py makemigrate ( APP名稱 ) # 產生本次要對DB做的事。尚未寫入db python manage . py sqlmigrate ( APP名稱 ) 0001 # 產生SQL語法,若DBA有想要知道的話。並且會產生migration資料夾,存放本次作業的程式碼(用django提供對db操作的語法)。仍尚未真實寫入db python manage . py migrate #實際寫入DB python manage . py shll # 提供ipython terminal,便於一些測試。不過本來就有裝的話,就沒必要使用了 setting.py,由名字可知所有基本設定都在這裡了;urls.py則是網頁的路徑;由於tutorial不會碰到wsgi.py,將在文後補充 開發前記得先修改時區,確保取到正確的時間 # 在setting.py中 TIME_ZONE = 'Asia/Taipei' 在urls增加

後端用django 前端用框架開發過程的跨域問題

後端用django 前端用框架開發過程的跨域問題 若後端採用django,前端打算選用框架來開發,不必自己辛苦融合 在github上可以找到已經處理好的,只要下載就可以開始project 以我熟悉的vue為例,在github上試了幾個,最後找到 tmpbook/django-with-vuejs 比較符合個人的規畫,而且又有中文說明XD (詳見參考資料) 試著練習開發時發現一個問題:django執行時有一個port,vue開發時也有一個port。寫get時還無妨,寫到post時就遇上跨網域存取禁止的問題 一開始傻傻的,一直build成結果檔,在從django的服務上測試 每build一次就要十來秒啊!邊開發邊debug時,超級痛苦!時間都浪費在等待上了… 後來再回去看說明,才發現文章中間有寫到開發過程中的跨域存取問題。真的是要乖乖看完readme再開始作業的QQ 以下作業幾乎就是照抄原文了 我想同樣都是初學者但用其他框架應該也有可能遇到一樣的問題 所以還是把這一塊單獨拉出來寫成一篇了 至少讓其他跟我一樣剛入門的可以少走一些歪路 要安裝django的三方套件:django-cors-headers來解決 安裝套件 pip install django - cors - headers 在setting.py中的MIDDLEWARE片段引用(注意,列表有順序性) MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware' , 'django.contrib.sessions.middleware.SessionMiddleware' , 'corsheaders.middleware.CorsMiddleware' , 'django.middleware.common.CommonMiddleware' , 'django.middleware.csrf.CsrfViewMiddleware' , 'django.contrib.auth.middleware.AuthenticationMiddle

PyQt5 QTableWidget 欄位值(cell)自動轉大寫

PyQt5 QTableWidget 欄位值(cell)自動轉大寫 稍微查一下PyQt5的語法,就會知道搭配Signal就可以讓cell被更動時觸發,並執行你要做的事 下列片段以本次主題:自動轉大寫為例 def __init__ ( self ) : #...省略其他片段 self . ui . tableWidget . itemChanged . connect ( self . upperText ) #...省略其他片段 def upperText ( self ) : item = self . ui . tableWidget . currentItem ( ) item . setText ( item . text ( ) . upper ( ) ) self . ui . tableWidget . setItem ( item . row ( ) , item . column ( ) , item ) 確實,這樣寫並沒有問題──只限於你的TABLE預設就有塞值在裡面 實務上,user倒入資料後(或是一啟動就直接連接資料庫取值),會發現程式直接崩潰 為什麼呢? 因為QTableWidget每次setItem時,都會觸發一次itemChanged! 而目前的table是空的,裡面沒有任何item,導致item.setText()這裡,找不到setText這個函數,於是程式就死掉了 解決方法就是 倒入資料到table時,暫停signal 在你放入資料的函數裡,頭尾分加入關閉、啟動signal就行了! def putIntoTable ( self ) : self . ui . tableWidget . blockSignals ( True ) for i in range ( 10 ) : self . ui . tableWidget . insertRow ( i ) self . ui . tableWidget . setItem ( i , 0 , QTableWidgetItem ( str ( i ) ) ) self . ui . tabl

PyQt5 QTableWidget 多選刪除

PyQt5 QTableWidget 多選刪除 在QTableWidget中,呈現TABLE的方式是從1開始 但實際儲存方式,則是從0開始 也就是要刪除看到的第一列,參數要給0 self . ui . tableWidget . removeRow ( 0 ) #刪除看到的第一列 self . ui . tableWidget . removeRow ( 1 ) #刪除看到的第二列 self . ui . tableWidget . removeRow ( N -1 ) #刪除看到的第N列 但是要多選刪除時 就不是簡單的跑一個迴圈就行了 items = self . ui . tableWidget . selectedIndexes ( ) wannaDelRows = [ item . row ( ) for item in items ] for row in wannaDelRows : self . ui . tableWidget . removeRow ( row ) 實際運行會發現,只有第一列正確被刪除,其他列似乎全都不對了?! 錯誤的原因是因為第一列被刪除後,該列後方的所有位置也跟著減-1了! 也就是當你只是單純地使用selectedIndexes()取得多選的列來刪除的話,從第2筆開始的指到row,已經不在是當初user選到要刪除的row了! 那該怎麼解決呢? 很簡單,從後面開始刪除就行了! 為避免user選的item是同一個row不同column 造成同一個row取到2次,導致跑迴圈時刪除到不應該被刪掉的 因此還需要搭配set確保要刪除的row只會被執行一次 將原本的程式碼修改如下 items = self . ui . tableWidget . selectedIndexes ( ) wannaDelRows = [ item . row ( ) for item in items ] wannaDelRowsReverse = sorted ( set ( wannaDelRows ) , reverse = True ) for row in wannaDelRowsReverse : self . ui

PyQt + pyinstaller,win工作列icon未正確顯示的問題

PyQt + pyinstaller,win工作列icon未正確顯示的問題 程式都完成了,最後為了一個小小的ICON,居然又折騰了一天… 在程式裡用 app.setWindowIcon(QIcon('icon.ico')) 開發環境下執行都正常,用pyinstaller打包後,ICON雖有顯示 但執行程式時,在WIN下的工作列卻是醜醜的程式框框圖 一搜尋馬上就發現也有人遇到一樣的問題: stack overflow/How to set application’s taskbar icon in Windows 7 但照著做,卻仍是沒icon。 查了許多篇似乎都指向pyinstaller的問題( github/Do not have a default-icon ) 但看文章時間都是4年前的時間了!一度跑去看pyinstaller的程式碼,感覺又像已修正過-.- 還試過直接去把pyinstaller的預設ico改成我自己的,再打包 仍是不行 最後,總算找到解決方法: 把icon打包至PyQt的qrc裡面,再從程式裡setWindowIcon 詳細作法: 新增一個icon.qrc的檔案,內容如下: <RCC> <qresource prefix="/" > <file>icon/anotherIcon.ico</file> //若是在其他目錄 <file>icon.ico</file> //若是跟程式同一層目錄 </qresource> </RCC> CD到專案目錄,執行: pyrcc5 -o iconQrc.py icon.qrc 到主程式修改你的setWindowIcon的ICON路徑,前面加冒號「:」 import iconQrc.py # your code app.setWindowIcon(QtGui.QIcon(':/icon.ico')) #若ICON在同一層目錄 app.setWindowIcon(QtGui.QIcon(':/icon/anotherIcon.ico')) #若ICON在子目錄

pyinstaller 離線安裝

Python中要安裝套件,正常情況下只要在terminal(或cmd)輸入 pip install pyinstaller 但若是在斷網的環境下開發作業 難免會需要先將常用的套件準備好,再帶至斷網環境 大部份的套件直接從GitHub或 PyPi.org 或其官網下載後,在斷網電腦下移動至該目錄 輸入 python setup.py 就會自動安裝 若下載的是whl檔,則可以直接用 pip install 將whl拖曳至cmd,會自動帶出此whl的路徑 也會自動安裝完成 而 Pyinstaller ,也可以用上述方式安裝完成 但實際執行時,會發現缺東缺西,無法正常運作 依其錯誤訊息,會發現是缺少其他相關套件。缺的還不少呢! 而且都是裝好一個才會帶出下一個= = 做個記錄以防下次要重裝時,又要再次闖關 一直在斷網、連網環境二邊跑也是滿累的 future pefile pywin32 上述安裝順序是闖關出現的順序 實際上你要反著安裝也沒差,反正全部都要有才動的了 補充: pyinstaller 常用參數