Django是一种基于Python的Web开发框架
什么是web框架?
框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。
对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。
最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。
Django的特点
- 功能完善、要素齐全:该有的、可以没有的都有,常用的、不常用的工具都用。Django提供了大量的特性和工具,无须你自己定义、组合、增删及修改。但是,在有些人眼里这被认为是‘臃肿’不够灵活,发挥不了程序员的主动能力。
- 完善的文档:经过十多年的发展和完善,Django有广泛的实践经验和完善的在线文档(可惜大多数为英文)。开发者遇到问题时可以搜索在线文档寻求解决方案。
- 强大的数据库访问组件:Django的Model层自带数据库ORM组件,使得开发者无须学习其他数据库访问技术(SQL、pymysql、SQLALchemy等)。当然你也可以不用Django自带的ORM,而是使用其它访问技术,比如SQLALchemy。
- 灵活的URL映射:Django使用正则表达式管理URL映射,灵活性高。
- 丰富的Template模板语言:类似jinjia模板语言,不但原生功能丰富,还可以自定义模板标签。
- 自带免费的后台管理系统:只需要通过简单的几行配置和代码就可以实现一个完整的后台数据管理控制平台。
- 完整的错误信息提示:在开发调试过程中如果出现运行错误或者异常,Django可以提供非常完整的错误信息帮助定位问题。
MVC模式与MTV模式
MVC模式:
MVC把Web框架分为3个基础部分:
模型(Model):用于封装与应用程序的业务逻辑相关的数据及对数据的处理方法,是Web应用程序中用于处理应用程序的数据逻辑的部分,Model只提供功能性的接口,通过这些接口可以获取Model的所有功能。白话说,这个模块就是Web框架和数据库的交互层。
视图(View):负责数据的显示和呈现,是对用户的直接输出。
控制器(Controller):负责从用户端收集用户的输入,可以看成提供View的反向功能。
这三个部分互相独立,但又相互联系,使得改进和升级界面及用户交互流程,在Web开发过程任务分配时,不需要重写业务逻辑及数据访问代码。
MVC在Python之外的语言中也有广泛应用,例如VC++的MFC,Java的Structs及Spring、C#的.NET开发框架,都非常有名。
MTV模式:
Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代表:
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
Django创建流程
1.下载Django
pip3 install django
2.创建Django项目
django-admin.py startproject 项目名
- manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
- settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
- urls.py ----- 负责把URL模式映射到应用程序。
3.创建一个应用
python manage.py startapp 应用名 譬如:python manage.py startapp app01
4.启动Django项目
python manage.py runserver ip port 譬如: #默认IP为127.0.0.1 python manage.py runserver 8080
5.同步更改数据库或字段:
python manage.py makemigrations python manage.py migrate 这种方法可以创建表,当你在models.py中新增了类时,运行它就可以自动在数据库中创建表了,不用手动创建。 PS:当执行python manage.py makemigrations报错 ... ... django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'. Did you install mysqlclient or MySQL-python?
解决方法: 在app01应用下面__init__.py文件中
import pymysql pymysql.install_as_MySQLdb()
6.清空数据库:
python manage.py flush 此命令会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表。
7.清空超级管理员
python manage.py createsuperuser # 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名密码必填 python manage.py changepassword username #修改用户名密码
8.Django项目环境终端:
python manage.py shell 这个命令和 直接运行 python 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据的测试非常方便。
9.数据库执行命令:
python manage.py dbshell Django 会自动进入在settings.py中设置的数据库,如果是 MySQL 或 postgreSQL,会要求输入数据库用户密码。 在这个终端可以执行数据库的SQL语句。如果您对SQL比较熟悉,可能喜欢这种方式。
10.更多命令
python manage.py 查看所有的命令,忘记子名称的时候特别有用。
Django的配置文件(settings)
1.静态文件:
在settings.py中可以看到最底部有一个STATIC_URL="/static/"配置。这就是访问静态资源的路由配置,我们可以理解为:Django为你自动配置了一个路由来访问静态资源,访问路径是 ip+prot/static/.....
有了这个设置,当我们访问静态资源时,比如http://127.0.0.1:8000/static/1.jpg,Django会默认在每个app内的static文件夹下寻找(注意一定要有static文件夹,名称不能出错,否则找不到),找到第一个后就返回。如果有所有app公用的静态资源,可以在项目文件夹下新建一个statics文件夹,做如下配置:
STATICFILES_DIRS = ( os.path.join(BASE_DIR,"statics"), )
如果再发起上述请求,首先在根目录下的statics内寻找,然后再去各app/static内寻找。但是这样会带来一个问题,如果多个app/static内有同名文件,我们很有可能获取不到想要的静态资源,
这时,需要配置路由,而且我们每个app内的static文件夹都改名,这里叫statics
# urls.py from django.urls import re_path from django.views.static import serve urlpatterns = [ re_path('static/app1/(?P<path>.*)', serve, {"document_root": "app1statics"}), re_path('static/app2/(?P<path>.*)', serve, {"document_root": "app2statics"}), ] # settings.py STATIC_URL = '/static/common/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), )
这样,我们就可以唯一区分每个静态文件夹内的文件了:
- static/common/.... 根目录的静态文件
- static/app1/.... app1的静态文件
- static/app2/.... app2的静态文件
2.中间件
前端页面中有form表单post方式报错,是因为Django的安全机制,在settings.py中的MIDDLEWARE内将 'django.middleware.csrf.CsrfViewMiddleware' 注释掉,或者在前端form表单内加入{% csrf_token %}即可。
3.url.py
from django.contrib import admin from django.conf.urls import url,include,re_path from app01 import views
4.views.py
from django.shortcuts import render,HttpResponse,render_to_response,redirect from django.template import Template,Context from app01 import models
5.时间
LANGUAGE_CODE = 'en-us' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False
6.限定访问源
为了安全起见,需要规定可以访问该服务器的IP/域名,如果不加限制,可以写一个*
ALLOWED_HOSTS = ["*"]