Django 简介
Django基于python的高级web开发框架。Django遵守BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 。Django采用了MVC的软件设计模式,即模型M,视图V和控制器C。
Django安装
sudo pip install Django
测试是否安装成功:终端输入代码
python -m django --version
如果显示安装的版本,就说明安装成功了。
Django使用
创建项目
- 创建项目
打开命令行,到想要创建项目的目录,执行:
django-admin startproject myblog
之后ls
显示该文件夹名,说明创建成功。
- 启动服务器
myblog
目录下有manage.py
的文件,打开命令行输入:
python manage.py
可以看到所有相关的命令,其中有一个是runserver
,根据名字就可以知道是启动服务器,所以输入命令:
python manage.py runserver
返回结果:
Starting development server at http://127.0.0.1:8000/
- 访问网址
打开浏览器访问网址127.0.0.1:8000/
或者localhost:8000
访问。
返回以下结果表示成功
It worked!
Congratulations on your first Django-powered page.
如果想要改变服务器的端口号,在runserver
的结尾处加上新的端口号即可:
python manage.py runserver 99999
- 工程目录说明:
在myblog目录下自动生成有一些py文件。
- urls.py: URL配置文件。Django 项目的 URL 声明, 一份由 Django 驱动的网站"目录"。
- wsgi.py: web服务器网关接口(Python Web Server Gateway Interface)。python应用与web服务器之间的接口。
- settings.py: 项目的总配置文件。包括:数据库、web应用、时间、编码等
(1)BASE_DIR
:项目根目录
(2)SECRET_KEY
:项目的安全码,Django自动生成。
(3)DEBUG = True/False
:调试开关
(4)ALLOWED_HOSTS
:访问主机列表,不为空则只能通过列表里的域名、IP来访问网站
(5)INSTALLED_APPS
:项目的应用列表,若创建了一个应用,要把应用名写在列表里
(6)MIDDLEWARE
:中间件,Django自带的工具集。
(7)TEMPLATES
:模板
(8)DATABASES
:数据库配置
(9)LANGUAGE_CODE
:语言配置
创建应用
- 创建应用
命令行在manage.py
下,执行
python manage.py startapp blog
打开编译器,看到生成blog
文件夹。
注意:
在settings.py
下的INSTALLED_APPS
中添加blog
。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog'
]
- 应用目录结构
- migrations 文件迁移模块
- admin.py 后台管理系统配置文件
- app.py 该应用的配置文件
- models.py 数据库框架 ORM框架
- tests.py 自动化测试模块
- views.py 执行响应的代码所在模块
创建页面/响应
- 编写响应函数
view.py
中编写响应函数,比如index()
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
- 配置url
方法1
urls.py
中配置响应函数的url
from blog import views
urlpatterns = [
url(r'^index/', views.index),
]
注意:url
是正则表达式
但是如果url都配置在这里,那么多页面,这里的配置势必会爆炸。
方法2
myblog.urls.py
中配置
from django.conf.urls import url, include
urlpatterns = [
url(r'^index/', include('blog.urls')),
]
然后在blog应用下新建文件urls.py
然后在新建的blog.urls.py
中配置
from django.conf.urls import url
from blog import views
urlpatterns = [
url(r'^index/', views.index),
]
但是发现在浏览器输入http://127.0.0.1:8000/index/
并找不到页面,而是需要
http://127.0.0.1:8000/index/index/
。因为myblog.urls.py
中配置的路径中已经有了一层index
- 改进1
新建的blog.urls.py
中配置
from django.conf.urls import url
from blog import views
urlpatterns = [
url(r'', views.index),
]
在浏览器输入http://127.0.0.1:8000/index/
页面显示正确,但是
http://127.0.0.1:8000/index/xxx
也会显示同样的内容,因此空格内容需要正则表达式进行限制。
- 改进2
blog.urls.py
中配置
urlpatterns = [
url(r'^$', views.index),
]
- 改进3
为了更易读的显示
myblog.urls.py
中配置
urlpatterns = [
url(r'^blog/', include('blog.urls')),
]
blog.urls.py
中配置
urlpatterns = [
url(r'^index/$', views.index),
]
注意index
后面的/
模板Templates
其实就是HTML文件。
默认是Django模板语言(DTL: Django Template Language)。
也支持第三方模板,比如jinia2
创建模板
- 在
app
根目录下创建templates
目录。 -
templates
目录下新建index.html
<html>
<head>
<title>my first html!</title>
</head>
<body>---
<p>hello world!</p>
</body>---
</html>
- 将
view.py
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello World')
改为
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
DTL 使用
render()
函数支持一个dict
类型参数。
该字典是后端传递数据到模板(前端)的参数,键值为参数名。
在模板中使用{{参数名}}
来直接使用。
例子:
在view.py
传入参数
from django.shortcuts import render
def index(request):
return render(request, 'index.html', {'hello_name':'xiaoming')
然后在index.html
中使用后端传来的该参数,访问页面即可看到效果。
<html>
<head>
<title>my first html!</title>
</head>
<body>---
<p>hello {{hello_name}}!</p>
</body>---
</html>
注意:
- 不同app应用下
templates
的同名.html
会冲突:
Django
按照settings.py
中的INSTALLED_APPS
的顺序查找templates
。如果两个app应用下的html文件重名,比如blog1应用
下的index.html
和blog2应用
下的index.html
重名,且INSTALLED_APPS
中先声明了blog1
,那么执行结果会都使用blog1
下的index.html
.
解决办法:
在app的templates
目录新建以app名
为名称的目录。将html
放入该目录下即可。
然后修改view.py
的html
路径
def index(request):
return render(request, 'blog/index.html', {'hello_name':'xiaoming'})
Models
Models简介
通常,一个models
对应数据库的一张数据表
Django
中models
以类的形式表现,它包含了一些基本字段以及数据的一些行为
ORM:对象关系映射(object relation mapping),实现了对象和数据库自己的映射,隐藏了数据访问的细节,不需要编写SQL语句。
Models编写
- 在app根目录下创建
models.py
,并引入models
模块,创建类,继承models.Model
,该类即是一张数据表。 - 创建字段
字段即类里的属性。比如models.py
创建类Article
:
class Article(models.Model):
title = models.CharField(max_length=32, default='title')
content = models.TextField(null=True)
- 生成数据表
执行命令:
python manage.py makemigrations app名(可选)
python manage.py migrate
Django
会自动在migrations
目录下生成迁移文件,比如0001_initial.py
,
并在应用根目录下生成db.sqlite3
。
推荐使用SQLite Expert Personal
打开sqlite3
文件, 添加数据
- 页面呈现数据
(1)后端
在view.py
中
def index(request):
article = models.Article.objects.get(pk=1)
return render(request, 'blog/index.html', {'article':article})
(2)前端
模板可以直接使用对象以及对象.
操作
在index.html
中
{{article.title}}
Admin
Django自带的功能强大的自动化数据管理界面,可以
- 管理数据库
- 定制功能
配置Admin
- 创建超级用户
python manage.py createsuperuser
然后输入账号密码即可。
- 登录
浏览器输入http://localhost:8000/admin/
, 然后账号密码登录。
- 修改语言
默认为英文,想要中文显示,修改setting.py
中的
LANGUAGE_CODE = 'en-us'
为
LANGUAGE_CODE = 'zh_Hans'
- 配置应用
在应用admin.py
中引入自身的models
模块。
import models
admin.site.register(models.Article)
刷新页面,就会看见,自己的应用Blog
,可以进行编辑。
- 修改数据默认显示名称
新建数据后,会发现显示的名称都是Article object
。
解决:
在models.py
的Article
类中添加方法
python2.7 添加__unicode__
class Article(models.Model):
title = models.CharField(max_length=32, default='title')
content = models.TextField(null=True)
def __unicode__(self):
return self.title
python3添加__str__
class Article(models.Model):
title = models.CharField(max_length=32, default='title')
content = models.TextField(null=True)
def __str__(self):
return self.title