在使用Flask框架时,项目工程目录的组织与创建是需要我们自己手动创建完成的。
在django中,项目工程目录可以借助django提供的命令帮助我们创建。以下命令都是在windows的cmd窗口创建
mkvirtualenv django_env_01
workon django_env_01
pip install django==1.11
查看是否安装成功
(django_env_01) D:\>pip list
Package Version
-------------------- -------
amqp 2.5.2
asgiref 3.2.7
billiard 3.6.3.0
celery 4.4.2
Django 1.11
创建工程的命令为:
django-admin startproject 工程名称
例如:想要在D盘的code目录中创建一个名为demo的项目工程,先要切换到D盘的code目录中,可执行如下命令:
D:
cd code
(django_env_01) C:\Users\Administrator>D:
(django_env_01) D:\>cd code
(django_env_01) D:\code>
django-admin startproject demo
执行后,会多出一个新目录名为demo如下,即为新创建的工程目录。
(django_env_01) D:\code>django-admin startproject demo
(django_env_01) D:\code>dir
驱动器 D 中的卷是 文档
卷的序列号是 0006-A235
D:\code 的目录
2020/10/24 21:44 <DIR> .
2020/10/24 21:44 <DIR> ..
2020/10/24 21:44 <DIR> demo
0 个文件 0 字节
3 个目录 57,446,785,024 可用字节
(django_env_01) D:\code>
查看创建的工程目录,输入tree /F /A可以看目录结构。 结构如下
(django_env_01) D:\code> tree /F /A
卷 文档 的文件夹 PATH 列表
卷序列号为 0006-A235
D:.
\---demo
|---manage.py
|
\---demo
|--- settings.py
| ---urls.py
| ---wsgi.py
|---__init__.py
(django_env_01) D:\code>
与项目同名的目录,此处为demo。
settings.py 是项目的整体配置文件。
urls.py 是项目的URL配置文件。
wsgi.py 是项目与WSGI兼容的Web服务器入口。
manage.py 是项目管理文件,通过它管理项目。
在开发阶段,为了能够快速预览到开发的效果,django提供了一个纯python编写的轻量级web服务器,仅在开发阶段使用。在这个服务器中,在需要的情况下会对每一次的访问请求重新载入一遍 Python 代码。所以你不需要为了让修改的代码生效而频繁的重新启动服务器。然而,一些动作,比如添加新文件,将不会触发自动重新加载,这时你得自己手动重启服务器。
python manage.py runserver ip:端口
或:
python manage.py runserver
可以不写IP和端口,默认IP是127.0.0.1,默认端口为8000。
为了方便起见,我们用pychram打开刚创建的项目,注:是用pycharm打开code文件夹下的第一个demo文件夹,为项目的根目录。
切换虚拟环境中的解释器(告诉pycharm你用的是哪个虚拟环境)。
依次点击 File—>settings---->project—>python Interpreter
打开pycharm的Terminal,输入 python manage.py runserver启动程序,可以看到如下语法错误(如果你用的python3.6之前的版本,则不存在此问题)
from django.contrib.admin.filters import (
File "D:\Documents\Python_virtualenv\django_env_01\lib\site-packages\django\contrib\admin\filters.py", line 10, in <module>
from django.contrib.admin.options import IncorrectLookupParameters
File "D:\Documents\Python_virtualenv\django_env_01\lib\site-packages\django\contrib\admin\options.py", line 12, in <module>
from django.contrib.admin import helpers, widgets
SyntaxError: Generator expression must be parenthesized (widgets.py, line 151)
这是因为,当前用的是Python3.8版本,而Python3.7版本之后就与django1.11不兼容,diango2之后版本修复了这个问题(其实是多了一个逗号)。方式一,升级django 。方式2,改源码。这里选择改源码,方法如下: |
将末尾逗号去掉即可。
然后从新打开终端,输入python manage.py runserver
(django_env_01) D:\code\demo>python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
October 24, 2020 - 23:15:27
Django version 1.11, using settings 'demo.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
可以看到,完美启动,在浏览器输入127.0.0.1:8000,如下:
也可以python manager --help 查看更多选项
Python manager --help
django默认工作在调式Debug模式下,如果增加、修改、删除文件,服务器会自动重启。按ctrl+c停止服务器。
点击 Edit Configurations ,填入如下
参数说明:
在Web应用中,通常有一些业务功能模块是在不同的项目中都可以复用的,故在开发中通常将工程项目拆分为不同的子功能模块,例如登录模块、注册模块、用户模块等等。各功能模块间可以保持相对的独立,在其他工程项目中需要用到某个特定功能模块时,可以将该模块代码整体复制过去,达到复用。可以达到分层解耦,易扩展和维护。在Flask框架中也有类似子功能应用模块的概念,即蓝图Blueprint。
Django的视图编写是放在子应用中的。
python manage.py startapp 子应用名称
manage.py 为上述创建工程时自动生成的管理文件。
例如,在刚才创建的demo工程中,想要创建一个登录login子应用模块,可执行:
cd code/demo
python manage.py startapp login
# 创建login子应用
(django_env_01) D:\code\demo>python manage.py startapp login
# 查看文件目录树
(django_env_01) D:\code\demo>tree /F
D:.
│---db.sqlite3
│---manage.py
│
├─demo
│ │---settings.py
│ │---urls.py
│ │---wsgi.py
│ │---__init__.py
│
│
└─login
│ admin.py
│ apps.py
│ models.py
│ tests.py
│ views.py
│ __init__.py
│
└─migrations
| __init__.py
执行后,可以看到工程目录中多出了一个名为login的子目录。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
注册安装一个子应用的方法的本质,是将子应用的配置信息文件apps.py中的Config类添加到INSTALLED_APPS列表中。
例如,将刚创建的login子应用添加到工程中,可在INSTALLED_APPS列表中添加’login.apps.LoginConfig’。其实也可以直接写创建的子应用名即可,例如直接写‘login’
如果用pycharm创建的工程,默认创建的第一个子应用,pycharm会自动帮你注册。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'login.apps.LoginConfig'
]
同Flask框架一样,Django也用视图来编写Web应用的业务逻辑。Django的视图是定义在子应用的views.py中的。
from django.http import HttpResponse
def index(request):
"""
index视图
:param request: 包含了请求信息的请求对象
:return: 响应对象
"""
return HttpResponse("hello world!")
说明:
视图函数的第一个传入参数必须定义,用于接收Django构造的包含了请求数据的HttpReqeust对象,通常名为request。
视图函数的返回值必须为一个响应对象,不能像Flask一样直接返回一个字符串,可以将要返回的字符串数据放到一个HTTPResponse对象中。
from django.conf.urls import url
from . import views
# urlpatterns是被django自动识别的路由列表变量
urlpatterns = [
# 每个路由信息都需要使用url函数来构造,django2以上版本用path from django.urls import path
# url(路径, 视图)
url(r'^index/$', views.index),
]
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls), # django默认包含的
# 添加
url(r'^login/', include('login.urls')),
]
说明:
from django.conf.urls import url, include
from django.contrib import admin
import login.urls # 先导入应用的urls模块
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url(r'^login/', include('login.urls')),
url(r'^login/', include(login.urls)), # 添加应用的路由
]