Django Series(Django2.1.2 + Anaconda3)
(一)安裝並配置 Django 環境 ||| 基於 Django 進行 Web 開發
(四)數據的增刪改:用戶提交數據,驗證數據的有效性並傳輸至後臺(jQuery.post、jQuery.getJSON)
(五)基於 "xlsxwriter + BytesIO"(Python3)生成 Excel 報表 ||| Python2 StringIO.StringIO()
說明:本系列教程根據最近實踐過程進行整理、總結和分享。由於時間和精力有限,發表時內容分析部分可能不是很完整,後續有時間會慢慢補充。同時!!也希望感興趣的同學可以提出一些細節問題和建議,我會根據這些問題進一步整理和完善哈。
更新日誌:
20181012:整理第一版,開始探索 Django1.10.8,並整理博文;
20181013:拋棄了使用不久的 1.10.8 版本,轉而使用 Django2.1.2 + Anaconda3,又是遇到一大推細節問題;
20181019:歸類於【Django Series】,主要是這篇博文的參考資料有歸納了之前關於 Django 的相關博文;
相關資源:
- Django 1.6.11 + Python2
- Django 1.10.8 + Anaconda2
- Django 2.1.2 + Anaconda3
最近剛嘗試使用 Django 1.10.8,很多內容還在學習中。嘗試了 Django 1.10.8 一段時間,感覺還ok啦。不過最近閱讀了 Django 官網文檔(https://www.djangoproject.com/start/overview/),得知 Django 1.11及以後的版本只支持 Python3,而團隊也建議使用 Python3 進行開發,畢竟後續應該是個趨勢了。想來想去,最終還是決定拋棄使用不久的 Django 1.10.8,開始嘗試使用最新版本的 Django 2.1.2 + Anaconda3。又是一段漫長的探索...
參考資料:
- Django documentation:https://docs.djangoproject.com/en/1.11/
- Django security releases issued: 1.11.5 and 1.10.8:https://www.djangoproject.com/weblog/2017/sep/05/security-releases/
- Django:簡單快速搭建一個網站雛形:https://blog.csdn.net/Houchaoqun_XMU/article/details/53693347
- Linux+Django+MySQL:安裝與配置,基本命令整理:https://blog.csdn.net/Houchaoqun_XMU/article/details/53813633
- 在Ubuntu服務器上搭建django + MySQL環境:https://blog.csdn.net/Houchaoqun_XMU/article/details/68060158
- MySQL數據遷移 - 基於 Django1.6.11 版本:https://blog.csdn.net/Houchaoqun_XMU/article/details/67006026
- 制定直線方程式和多項式方程式並顯示:https://blog.csdn.net/Houchaoqun_XMU/article/details/71216006
基本操作步驟:
- 安裝 python 和 django,並配置環境變量;
- 將 django-admin.py 文件複製到目錄 A(A表示你想在該目錄下創建項目);
- 輸入【 python django-admin.py startproject project_name 】創建項目;此時在目錄 project_name 下會生成 manage.py;
- 輸入【 python .\manage.py runserver 127.0.0.1:8000 】運行本地IP,跑起項目;此時即可選擇瀏覽器,輸入網址 http://127.0.0.1:8000/ 打開網頁;
- 輸入【 python .\manage.py startapp appName 】創建app項目,並進行如下配置:
- 手動添加urls.py;
- 配置【setting.py】,包括appName、templates、static等(後續的數據庫類型也是在這裏配置);
- 理解每個appName下的urls.py和projectName目錄下的urls.py的關係,比進行配置;
- 編寫appName目錄下的【views.py】,返回變量和具體網頁;
- 創建數據庫
- django 1.10.8版本:輸入【python manage.py migrate】
- django 1.6.11版本:輸入【 python .\manage.py sycndb 】
查看 django 版本
## way-1
>>> import django
>>> print django.VERSION # Python2的格式
>>> print(django.VERSION) # Python3的格式
## way-2
python -m django --version ## 直接在終端輸入
Django 2.1.2
difference:
## 1.6.11
## 1.10.8
urlpatterns = [
url(r'^$', views.Home_ManageSystem, name='Home_ManageSystem'),
url(r'^admin/', include(admin.site.urls)),
]
## 2.1.2
urlpatterns = [
path(r'^$', views.Home_ManageSystem, name='Home_ManageSystem'),
path('admin/', admin.site.urls),
]
# app_name = 'app_ManageSystem'
# https://docs.djangoproject.com/en/1.9/intro/tutorial03/#namespacing-url-names
Django 2.1.2:登錄默認界面 http://127.0.0.1:8000/
problems:
## 數據庫中新增的 on_delete 參數
File "F:\for_jackan\app_ManageSystem\models.py", line 12, in BRsystemUser
Users = models.OneToOneField(User)
TypeError: __init__() missing 1 required positional argument: 'on_delete'
##
File "C:\Anaconda3\lib\site-packages\django-2.1.2-py3.5.egg\django\urls\conf.py", line 39, in include
'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported.
Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.
[05/Sep/2017 12:24:59] "GET /hello HTTP/1.1" 404 1947 Not Found: /favicon.icov
配置 setting(django 1.10.8):
setting.py 是在 python django-admin.py startproject project_name 的時候自動創建的。django 1.10.8 相較於 django 1.6.11 的變動不大,主要是 TEMPLATES,如下所示:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'debug': True,
},
},
]
配置 urls(django 1.10.8):
project 目錄下的 urls.py:相對 django 1.6.11 版本還是有較大的變化,django 1.10.8 版本配置如下所示:
- 導入所有 app_name 目錄下的 views:from app_ActiveModels import views
- url 路由:url(r'^$', views.Home_ActiveLearningSystem, name='Home_ActiveLearningSystem')
django 1.6.11 版本配置:url(r'^$', 'app_analyse.views.main'),直接使用 app_analyse.views.main 即可找到對應的函數。咋一看新的版本好像還比較麻煩,但這樣改肯定也是有一定的道理(我也是最近纔開始使用 django 1.10.8 版本,因爲在數據庫方面做了較大的改進,允許不刪除表的情況下,增加新的表字段)。
"""ActiveLearning_system URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url, include
from django.contrib import admin
from app_ActiveModels import views
urlpatterns = [
url(r'^$', views.Home_ActiveLearningSystem, name='Home_ActiveLearningSystem'),
url(r'^admin/', admin.site.urls),
url(r'^app_ActiveModels/', include('app_ActiveModels.urls', namespace = 'app_ActiveModels')),
]
## + static(settings.STATIC_URL, document_root = settings.STATIC_ROOT)
django 1.10 數據庫遷移:
python manage.py migrate
python manage.py makemigrations app_ManageSystem
python manage.py createsuperuser ## 創建超級管理員
MySQL 數據庫操作:
CREATE DATABASE DB_BR_Pro_Manage_System CHARACTER SET utf8;
drop database DB_BR_Pro_Manage_System;
運行:
(! python ./manage.py runserver 47.106.205.122:8000 &)
(! python manage.py runserver 0:8000 &)
(! python manage.py runserver 0:8000 --insecure &)
注意:
- 服務器上選擇的端口,要注意是否開放。
- Django運行訪問項目出現的問題:DisallowedHost at / Invalid HTTP_HOST header(在setting配置處,改爲 ALLOWED_HOSTS = ['*'])
在 views.py 中導入外部自定義的 py 文件:
想必很多人都有這個需求:不想把所有的代碼都寫在 veiws.py 文件中,不好管理且可讀性又差。
- veiws.py 文件用來實現邏輯、以及渲染指定的 html 文件;
- 一些計算過程、算法寫在外部自定義的 py 文件中,如:在根目錄下新建一個 lib 文件夾,然後再lib目錄下新建一些所需要的 py 腳本。
方法:
import sys
sys.path.append("lib_hcq")
from lib_hcq.log_relevant import *
遇到的問題:
ImportError: No module named lib_hcq.log_relevant
解決辦法:
## 問題:lib_hcq 目錄下沒有 __init__.py 文件
## 解決:創建一個空的py文件,命名爲 __init__.py,在 views.py 文件中引入:
sys.path.append("lib_hcq/log_relevant.py")
from lib_hcq.log_relevant import *
## A package can be imported with import foo.bar or from foo import bar.
## For a directory (like polls) to form a package, it must contain a special file __init__.py, even if this file is empty.