一、简介
Django是一个开放源代码的Web应用框架,由Python写成,只需要程序员完成很少量的代码,就能够很好的完成网站开发,已经成为web开发者的首选框架。Django采用了MTV的框架模式,即模型Model,视图Views和模版Template。Django也是一个遵循 MVC 设计模式的框架,即模型Model、视图View、控制器Controller。
二、安装django并创建一个新项目
- 安装django
yang@TUF:~$ pip install django
- 创建新项目
# 创建一个名为zhixi的新项目(会在当前文件夹中创建一个名为 zhixi 的新文件夹)
yang@TUF:~$ django-admin startproject zhixi
# 进入项目文件夹
yang@TUF:~$ cd zhixi
# 查看项目的文件目录
yang@TUF:~/zhixi$ tree
.
├── manage.py
└── zhixi
├── asgi.py
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
# 运行项目,通过端口访问
yang@TUF:~/zhixi$ python3 manage.py runserver
# 自定义端口:
yang@TUF:~/zhixi$ python manage.py runserver 0.0.0.0:8000
然后通过本地默认端口127.0.0.1:8000在浏览器中访问项目,也可以根据需要自定义端口地址。
-
安装及初始化过程如有疑问,可以参考:
Django官方文档
。
三、完善项目文件结构
在初始化的新项目有些文件和设置不太完善,我希望按照自己的习惯和常用的模块去调整一些基本设置。方便起见,这里不进行前后端分离开发的设置,若要实现前后端分离,只需要将templates文件夹步骤去掉,将整个django仅仅视为一个后端响应+数据库接口就可以了。
1. views.py
首先需要创建
views.py
文件:
yang@TUF:~/zhixi$ vi zhixi/views.py
并在
views.py
中写入:
from django.http import HttpResponse
from django.shortcuts import render
# 仅作为后端响应请求
def hello(request):
return HttpResponse("Hello world ! ")
# 响应请求后发回html页面及向其传递的参数
def hello(request):
context = {}
context['hello'] = 'Hello World!'
return render(request, 'hello.html', context)
views.py
视图文件,是django编写后端响应算法的主要逻辑文件,其内定义了若干函数,每个函数获取到特定请求后,经过一系列的逻辑操作,如访问数据库等,将结果返回给请求的发起者,如果定义了模板,也可以将结果作为参数发送给模板中的html文件,然后将html文件返回给请求的发起者。
2. urls.py
打开
urls.py
文件并定义路由:
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('/', views.hello)
]
urls.py
路由文件,是django收到请求后分配的路由文件,负责将受到的请求分配给
views.py
中对应的响应函数,通过定义url和视图函数之间的对应关系来实现。
3. Templates模板
创建templates文件夹:
# 创建模板文件夹
yang@TUF:~/zhixi$ mkdir templates
# 创建模板html文件
yang@TUF:~/zhixi$ vi templates/hello.html
向
hello.html
中写入:
<h1>{{ hello }}</h1>
修改
settings.py
中的模板路径
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',
],
},
},
]
templates
模板文件夹,主要保存html等前端文件,html文件接收来自视图函数的参数,供视图函数调用返回,作为网页页面展示给用户,可以视为django的前端。
4. Model模型
如果没有安装数据库,需要先安装,这里安装mysql(有很多方式,这只是其中一种):
# 安装rpm,是一个强大的命令行驱动的软件包管理工具,用来安装、卸载、校验、查询和更新 Linux 系统上的软件包。
yang@TUF:~/zhixi$ sudo apt install rpm
# 查看系统上是否已经安装数据库
yang@TUF:~/zhixi$ rpm -qa | grep mysql
# 若有数据库,可以选择卸载数据库
yang@TUF:~/zhixi$ rpm -e mysql // 普通删除模式
yang@TUF:~/zhixi$ rpm -e --nodeps mysql // 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除
# 下载mysql资源包,网址为:https://dev.mysql.com/downloads/repo/yum/
yang@TUF:~/zhixi$ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
# 安装mysql资源包
yang@TUF:~/zhixi$ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
# 安装mysql-sever
yang@TUF:~/zhixi$ sudo apt install mysql-server
# 权限设置
yang@TUF:~/zhixi$ sudo chown -R mysql:mysql /var/lib/mysql/
# 初始化mysql
yang@TUF:~/zhixi$ sudo mysql --initialize
# 启动mysql服务
yang@TUF:~/zhixi$ sudo systemctl start mysql
# 查看mysql服务状态
yang@TUF:~/zhixi$ sudo systemctl status mysql
# 停止mysql服务
yang@TUF:~/zhixi$ sudo systemctl stop mysql
# 此时可以在命令行打开mysql,则安装成功
yang@TUF:~/zhixi$ sudo mysql -u root
# 安装mysql在python的驱动
yang@TUF:~/zhixi$ sudo pip install pymysql
安装好mysql后需要对用户、用户组、端口、密码等进行设置:
# 从命令行连接mysql
yang@TUF:~/zhixi$ sudo mysql -u root
# 查看mysql的端口
mysql> show global variables like 'port';
# 创建数据库名为my_database
mysql> create database my_database;
# 更改root用户的密码
mysql> alter mysql.user 'root'@'localhost' identified with mysql_native_password by '123456';
# 但我是了好几次都会报语法错误,最后通过下面的方式解决的
# 将用户表中root用户的登陆方式改为mysql_native_password密码登录
mysql> update mysql.user set plugin='mysql_native_password' where user='root';
# 刷新授权
mysql> flush privileges;
# 修改root用户的密码为123456
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
# 再次刷新授权
mysql> flush privileges;
# 退出mysql
mysql> exit
django规定,如果要使用模型,必须要创建一个app。所以我们需要在项目中创建一个app:
# 会在当前文件夹下创建一个名为 model 的新文件夹
yang@TUF:~/zhixi$ django-admin startapp model
# 编写models.py来创建数据库的表
yang@TUF:~/zhixi$ vi model/models.py
写入:
from django.db import models
class my_model(models.Model):
name = models.CharField(max_length=20)
修改
settings.py
中的数据库和app的设置
import os
DATABASES = {
'default':
{
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'my_database', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'model', # 添加此项
)
django2.2版本后,数据库使用的MySQLdb改为了mysqlclients,首先尝试 pip install mysqlclients,如果失败,可以在settings.py同级目录下的*
init
.py*文件中加入:
import pymysql
pymysql.install_as_MySQLdb()
在
views.py
文件中导入
models.py
中定义的模型:
yang@TUF:~/zhixi$ vi zhixi/views.py
# 加入:
from model.models import *
如果改变了
models.py
中表的结构,则需要在运行django项目之前,做一次更新迁移。
# 让 Django 知道我们在我们的模型有一些变更
yang@TUF:~/zhixi$ python3 manage.py makemigrations model
# 创建表结构
yang@TUF:~/zhixi$ python3 manage.py migrate model
model
文件夹,以一个独立的app的形式存在,作为django与数据库通讯的接口,可以在
view.py
视图中被引用和调用,通过ORM语句或原生SQL语句对数据库进行增删改查等操作。
Django使用
对象关系映射(Object Relational Mapping, ORM )
。使用ORM语句更易于编程,但执行效率相对于原生SQL更低。ORM 在业务逻辑层和数据库层之间充当了桥梁的作用:
ORM 对应关系表:
OK到这里,完整的django框架就修改完了,可以开发自己的网站了,完整的文件结构:
整个框架各部分的功能关系如下图:
参考资料:
Django菜鸟教程