Django框架-基础篇
Django框架简介
一、软件架构模式MVC和MTV
1、MVC模型
MVC(model view controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(model)、视图(view)和控制器(controller),具有耦合性低,重用性高,生命周期成本低等优点。
2、MTV模型
Django框架的设计模式借鉴了MVC框架的思想,也是分别三部分,来降低各个部分之间的耦合性。
Django的MTV分别代表:
Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM)
Template(模板):放所有的html文件,负责如何把页面展示给用户
模板语法:目的是将自变量(数据库的内容)如何巧妙的嵌入到html页面中
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个URL分发器。它的作用是将一个个URL的页面请求分别发给不同的Views处理,Views再调用相应的Model和Template。
3、MVC和MTCV的比较
二、Django 下载安装
查看django版本:
cmd——>python -m django --version
pycharm——> import django ; print(django.version)
命令行下载安装:
dos窗口中: pip install django== 1.11.15 # 等号后为版本号,不加的话默认安装最新版本 pip install -i https://pypi.doubanio.com/simple/ django==1.11.15(或者-i 指定源)
pycharm的方式安装
打开pycharm -->file -->settings --> project interpreter --> 点击右侧绿色加号 -->在弹出对话框中输入django -->选中specify version,指定下载版本,默认最高版 -->最后点击左下角 install package
注:默认从https://pypi.python.org/simple下载模块,可更改国内的豆瓣源,点击install package 右侧的Manage Repositories 在里面添加其它的源,如https://pypi.doubanio.com/simple/
详细见下图:
三、创建Django项目对象
命令行创建:
切换目录到预存放项目文件的文件目录 django-admin startproject 项目名称 eg: django-admin startproject myblog
生成目录结构如下:
- manage.py------启动文件 (Django项目里面的工具,通过它可以调用Django shell的数目和数据库等)
- settings.py------包含了项目的一些设置,包括数据库信息、调试标志以及其他一些工作的变量。
- urls.py-----------路径与视图函数的映射关系
- wsgi.py ...........帮我们实现socket,响应http请求
注:命令行创建,不会创建templates模板【用于仅存放html文件,css,js等静态文件放到新建的static目录中】,
需要自己在项目根目录即与manage.py同级目录下创建templates文件夹,且要到settings.py中修改templates的DIRS中加入os.path.join(BASE_DIR,'templates')
pycharm方式创建
打开pycharm--->file ---->new project ---> 选中django
创建完成后项目目录结构如下:
注:上面app01为创建的一个应用,Mysite为创建django目录时,自动在项目名下建立一个同名的目录。
四、启动Django项目
1、命令行方式
切换到django项目根目录下(含有manage.py 的文件) # 默认为本地,端口为8000 python manage.py runserver # 127.0.0.1:8000 # 可修改端口 python manage.py runserver 80 # 127.0.0.1:80 # 可修改ip和端口,4个零表示所有人都可以访问 python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80 注:当项目上线后,需将ip和端口改为实际的
2、pycharm方式
一个项目就是一个包,不要单独执行某个py文件,而是运行整个项目
五、创建应用
注:因为一个项目要实现多个功能,因此一个Django项目可以分为很多个APP,用来隔离不同功能模块的代码
如果不建立app也可以执行项目,即视图函数直接写在urls.py中,在settings.py中配置相关的模板,数据库信息,静态文件等信息。
命令行创建app
python manage.py startapp 应用名
eg: python manage.py startapp app01
执行命令后,项目目录下多出一个app01的文件夹,目录结构如下:
app01/
migrations 记录修改models即orm操作数据库的更改信息,每次更改都会在改目录下新建一个文件
__init__.py
__init__.py
admin.py
apps.py 记录app信息,当在settings.py中注册app时是从此处找
models.py 记录创建类【即相当如向数据库中创建表】在此处创建
tests.py
views.py 本app自己的业务逻辑函数即视图函数写在这里
使用PyCharm创建
可以使用PyCharm的manage.py工具来执行命名。在主菜单栏中选择Tools,在下拉菜单中选择Run manage.py task,会出现如下图所示的工具对话框:
在弹出的命令窗口中直接输入下面的命令便可创建app:
startapp app01
使用PyCharm的manage.py工具执行命令时,只用输入命令及参数即可,不再输入python manage.py了。
注册app应用
创建完app后,想要使用,需先注册才能使用,在django根目录下的settings.py文件中的INSTALLED_APPS模块中注册app信息
格式如下:
应用名.apps.应用名Config
示例:【本质是导入应用目录下apps中为app建立的类】
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'classModel.apps.ClassmodelConfig'
]
apps.py文件内容如下图:
六、配置django项目与数据库mysql的连接
1、安装mysql数据库软件
2、安装 模块pymysql【python3.6后连接mysql只能用pymysql】
cmd--> pip3 install pymysql
3、手动连接数据库,创建一个库及创建一个操作此数据库的用户,赋予权限【django的ORM只能创建表,不能创建库】
# 创建库
create database db_name charset utf8;
# 创建用户及赋予权限
grant all privileges on db_name.* to 'userName'@'ip' identified by 'pwd';
4、在Django项目总配置文件setting.py同级目录下[不是app下的__init__]的__init__.py文件中配置项目使用pymysql来操作数据库
import pymysql
pymysql.install_as_MySQLdb() # 告知django使用pymysql来连接书库
5、在Django项目总配置文件setting.py中的DATABASES模块中配置连接数据库相关信息,格式如下
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 修改数据库引擎,默认为sqlite3文本数据库
'NAME': 'db_name',
'USER': '**',
'PASSWORD':'***',
'HOST':'ip',
'PORT': 3306, # 注意是数字,不是字符串
}
}
6、建表 在应用app的目录下的models.py中写类【必须继承models.Model类】
from django.db import models # 需先导入models模块
class Class(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20, unique=True)
def __str__(self):
return self.name
# 在orm中
类 对应数据库中的 表
对象 对应数据库中的 记录(数据行)
属性 对应数据库中的 字段
7、建好类即表后,执行数据库迁移命令【让创建的表在数据库中生成】
# 记录models.py中类是不是有变化 将变化的内容记录下来
python manage.py makemigrations
# 将model的变更同步到数据库中
python manage.py migrate
注:执行第一条命令后models.py中的变化就会在到migrations目录中创建一个新的文件并将变化写入其中
如果在原有表张增加字段的话,会提示要设置默认值,因为新的那列数据不能为空
七、项目启动后相关配置
1、更改setting.py
1.1、检查项目BASE_DIR是否如下:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
1.2、配置ALLOWED_HOSTS可以运行本项目的ip,'*' 代表所有
ALLOWED_HOSTS = ['*',‘127.0.0.1’,‘192.168.19.66’]
注:如想别人访问你的网站,需在启动项目时将ip配置为0.0.0.0,如何将运行项目的ip写入上面列表,用户就可以通过你的主机ip访问你的网站了
1.3、配置INSTALLED_APPS,为创建的应用app进行注册,不然操作数据库时报错
格式:'app_name.Apps.AppName.Config' 或 ‘app_name’
INSTALLED_APPS = [
'classModel.apps.ClassmodelConfig'
]
1.4、配置中间件MIDDLEWARE,注释csrf,让后台能够接收所有的post请求,不关闭django将对不合法的post拦截403
将 'django.middleware.csrf.CsrfViewMiddleware'注释掉,否则会出现下面的情况。
注:上面的方案,不建议使用,不安全,可以在html文件中要发送post请求的from表单里加入{% csrf_token %}就不用注释上面的csrf的中间件了
如下图:
前端实际效果为:
1.5、配置模块templates 中的DIRS需要检查下是否为空,如果为空,添加上os.path.join(BASE_DIR,'templates')
命令创建的项目未创建模板templates目录,需自己创建。
这是模板中没有设置,设置模板在python安装目录中找到如下图的路径,打开settings.py-tpl,相同位置添加上上os.path.join(BASE_DIR,'templates')。下次创建项目就可不再手动添加。
1.6、settings.py中增加静态文件目录STATICFILES_DIRS【(js,css,image)存放目录】,这是放在templates中html文件能够使用js,css资源的关键
在项目根目录即与manage.py文件同级下创建静态文件夹static,如果有多个就创建多个,但网页中不论是放在那个文件中,开始都以/static/开头
1.7、templates文件夹下创建/或存放HTML文件,将html的js,css,imgs等文件放入images
2、编辑urls.py文件,增加映射关系。
业务函数的实现,业务函数与url的映射可都在此文件中书写,以后规范化,可将业务函数移入到应用的views.py中,此文件仅编辑业务函数与url的映射关系,再导入views.py中所有的业务函数
即from app名 import views
下图为:直接将视图函数写在全局urls.py文件中
八、访问web
1、局域网中的浏览器输入HTTP://IP:PORT/login 就可访问验证。
九、如何完全的删除一个应用app?
1.删除models.py
无论是删除一个单独的model还是删除整个App,都需要首先删除models.py文件中的模型。
确认没有其他文件引用models.py中的类。
迁移或者删除你的数据库,Django提供了简便的方法方便用户删除某App下的所有数据(Django 1.7)。
python manage.py migrate your_app_name zero
删除models.py中的数据模型。
2.删除App
再次确认其他App中没有引用此App的文件
删除整个App文件夹
在settings.py的Installed Apps中移除该app
在urls.py中移除该App相关内容。
十、Django快速开发配置小结:
在app的models.py创建类(即数据库中的表)
在views.py下创建业务视图函数[导入orm模块]
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.shortcuts import redirect
from classModel import models
在django的templates目录下创建前端html文件
在在django的static目录下存放js,css.images 文件
在urls.py下建立映射关系
from classModel import views