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.