一、Django概述
Django是一个由Python编写的开源的Web应用框架(用于进行Web开发的一套软件架构)
使用Django框架,只需要很少的代码就可以轻松完成一个正式网站所需要的大部分内容,并且进一步开发出全功能的Web功能。Django本身基于MVC模型(Model模型+View视图+Controller控制器的设计模式),MVC模式使后续对程序的修改和扩展简化,并且使程序的某一部分重复利用成为可能
Django是MTV模式,本质和MVC模式是一样的
Python+Django使快速开发、设计、部署网站的最佳组合,特点:
强大的数据库功能
自带强大的后台功能
优雅的网址
- MVC模型
- MVC模式是一种软件架构模式,它把软件系统分为三个部分:
模型(Model):业务逻辑处理,主要用来负责业务逻辑的处理、数据的保持,编写程序应有的功能,负责业务对象与数据库的映射(ORM对象映射关系),Model使MVC模型的核心部分,并且它也是需要实现的最主要的部分 (编写的功能、数据库的连接与管理)
视图(View):画面表示,图形界面,负责与用户的交互 (展示的页面)
控制器(Controller):控制,负责转发请求,接收从View视图发过来的数据,并且对请求进程处理,主要负责控制Model模型和View视图 (负责转发用户请求对请求进行处理)
MVC模式的目的是实现一种动态的程序设计,用于简化后续对程序的修改和扩展,并且使程序某一部分的重复利用成为可能
MVC以一种插件式的、松耦合的方式连接在一起,下面是菜鸟的用户操作流程图:
下面是从Django MTV和MVC的区别 (biancheng.net)网站中MVC的流程图
- MTC模型
- Django的MTV模式本质上和MVC是一样的,这也是为了各组件间保持松耦合关系,只是定义上有些不同,Django的MTV分别是:
模型(Model):编写程序应有的功能,负责数据管理 (与MVC的模型作用相似)
模板(Template):负责网页展示 (相当于MVC的视图)
视图(View):负责业务逻辑控制,并且会在适当时候调用模型和模板 (相当于MVC的控制器)
除了上面三层之外,还需要一个URL分发器,分发器的作用是将一个个URL的页面请求分发给不同的视图处理,视图再去调用相应的模型和模板,下面是菜鸟的用户操作流程图:
下面是从Django MTV和MVC的区别 (biancheng.net)网站中MTC的流程图
二、安装Django(windows)
注意:这里使用VSCode安装Django
- 安装VSCode,安装后进入扩展,安装Python
创建项目文件夹
使用VSCode打开项目文件夹django,然后打开终端,输入python -m venv test,创建虚拟环境test
在VSCode中按键Ctrl+Shift+p,输入>python:Select Interpreter,选择Python解释器为虚拟环境的路径
(就是创建的虚拟环境目录下的python程序)
- 进入虚拟环境,安装Django(在终端中操作)
#进入虚拟环境 PS F:\django> cd .\test\Scripts\ PS F:\django\test\Scripts> . .\activate #进入虚拟环境 (test) PS F:\django\test\Scripts> #前面多出(test)表示成功进入虚拟环境 #安装django (test) PS F:\django\test\Scripts> pip -V pip 22.0.4 from F:\django\test\lib\site-packages\pip (python 3.10) (test) PS F:\django\test\Scripts> pip install django #下载慢的话使用这个 —————————————————————————————————————————————————————— pip install -i https://pypi.douban.com/simple django —————————————————————————————————————————————————————— (test) PS F:\django\test\Scripts> python Python 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import django #成功导入,可以看到版本,就说明安装成功 >>> django.VERSION (4, 1, 0, 'final', 0)
- 至此,windows上的django安装完成
三、第一个Django项目
- 安装Django后,我们可以使用管理工具
django-admin
(test) PS F:\django\test\Scripts> django-admin #直接执行,会有此命令的介绍 Type 'django-admin help <subcommand>' for help on a specific subcommand. Available subcommands: [django] check compilemessages createcachetable dbshell diffsettings dumpdata flush inspectdb loaddata makemessages makemigrations migrate runserver sendtestemail shell showmigrations sqlflush sqlmigrate sqlsequencereset squashmigrations startapp startproject test testserver Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.).
- 下面来创建
helloworld
项目
#回到项目目录 (test) PS F:\django\test\Scripts> cd ../../ (test) PS F:\django> django-admin startproject helloworld #创建django项目helloworld (test) PS F:\django> ls 目录: F:\django Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2022/7/1 16:59 helloworld #可以看到成功创建 d----- 2022/7/1 16:53 test (test) PS F:\django> cd .\helloworld\ (test) PS F:\django\helloworld> ls 目录: F:\django\helloworld Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2022/7/1 16:59 helloworld -a---- 2022/7/1 16:59 688 manage.py (test) PS F:\django\helloworld> python .\manage.py runserver 0.0.0.0:8000 #启动,端口8000,0.0.0.0可以使所有IP都可以访问,如果只配置端口,那么只有本地能访问 Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). You have 18 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. July 01, 2022 - 17:25:35 Django version 4.0.5, using settings 'helloworld.settings' Starting development server at http://0.0.0.0:8000/ Quit the server with CTRL-BREAK. #Ctrl+c退出
- 访问本地
127.0.0.1:8000
,访问成功!!!
- 创建之后,其实可以看到此项目的目录结构:
(test) PS F:\django\helloworld> ls 目录: F:\django\helloworld Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2022/7/1 17:01 helloworld #这个就是项目容器 -a---- 2022/7/1 17:01 0 db.sqlite3 #这个是python自带的数据库 -a---- 2022/7/1 16:59 688 manage.py #一个实用的命令行工具,让我们可以以各种方式与Django项目进行交互 (test) PS F:\django\helloworld> ls .\helloworld\ 目录: F:\django\helloworld\helloworld Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2022/7/1 17:01 __pycache__ -a---- 2022/7/1 16:59 413 asgi.py #一个ASGI兼容的Web服务器入口,方便运行我们的项目 -a---- 2022/7/1 16:59 3356 settings.py #此Django项目的设置文件 -a---- 2022/7/1 16:59 773 urls.py #此Django项目的URL声明,一份由Django驱动的网站“目录”,里面可以指定“网页” -a---- 2022/7/1 16:59 413 wsgi.py #一个WSGI兼容的Web服务器入口,方便运行我们的项目 -a---- 2022/7/1 16:59 0 __init__.py #一个空文件,告诉Python此目录是一个Python包
- 在创建Django项目后,项目目录的结构:
- helloworld:项目容器
- manage.py:Django的命令行工具
项目容器中的文件:
- asgi.py:一个ASGI兼容的Web服务器入口,方便运行我们的项目
- settings.py:此Django项目的设置文件
- urls.py:此Django项目的URL声明,一份由Django驱动的网站“目录”,里面可以指定“网页”
- wsgi.py:一个WSGI兼容的Web服务器入口,方便运行我们的项目
- __init__.py:一个空文件,告诉Python此目录是一个Python包
- 网页可以调整为中文,修改项目容器中的
settings.py
文件,修改LANGUAGE_CODE
为zh-Hans
注意:代码修改完后无需重启,服务器会自动检测代码的改动并且自动载入
- 再次访问:
- 我们在启动的时候,虽然是配置了
0.0.0.0:8000
,但是还需要改一下配置,才可以使其他ip都能访问,同样还是settings.py文件,修改ALLOWED_HOSTS = []
为ALLOWED_HOSTS = ["*"]
在修改文件、保存之后,可以从终端看到重载的日志:
- 更换页面(添加访问资源)
- 在helloworld目录下的helloworld容器中,新建一个
index_test.py
文件,这是我们新建的页面
#-*- coding: utf-8 -*- from django.http import HttpResponse def hello(request): return HttpResponse("Hello World!!!")
- 文件创建后,绑定URL和视图函数,打开
urls.py
文件,删除原来代码,重新编写
其中path()函数的使用:
path(route, view, kwargs=None, name=None)
route:必选参数,传入字符串,表示URL匹配规则,会执行对应的第二个参数view
view:必选参数,用于执行与正则表达式匹配的URL请求,下面就是调用了index_test模块中的hello函数,也就是调用页面的
kwargs:可选参数,视图使用的字典类型的参数
name:用来反向获取URL
#-*- coding: utf-8 -*- from django.urls import path from . import index_test urlpatterns = [ path('hello/',index_test.hello), #指定hello资源,这里指定的就是index_test.hello()方法 ]
修改后,可以看到,日志刷新,访问127.0.0.1:8000/hello,发现页面已经更改
- 注意:
菜鸟教程中导入的是
django.conf.urls
,此方法在Django2.0以上版本已经被django.urls
取代,所以需要使用path