Django(Python Web框架)学习(二)快速入门
一、Django框架介绍
1、什么是框架?
- 软件框架就是为实现或完成某种软件开发时,提供了一些基础的软件产品
- 框架的功能类似于 基础设施 ,提供并实现最为 基础的软件架构和体系
- 通常情况下我们依据框架来实现更为复杂的业务程序开发
- 二个字,框架就是程序的 骨架
2、Python 中常见的框架有哪些?
- 大包大揽 Django 被官方称之为完美主义者的Web框架。
- 力求精简 web.py 和 Tornado
- 新生代微框架 Flask 和 Bottle
3、Django 框架介绍
- Django 是一个高级的Python Web框架,它鼓励快速开发和清洁,务实的设计。
- 由经验丰富的开发人员构建,它负责Web开发的许多麻烦,因此您可以专注于编写应用程序,而
- 无需重新创建轮子。
- 免费的和开源的。
- 被官方称之为完美主义者的Web框架。
官方网址:https://www.djangoproject.com/
4、Django 框架的特点
- 快得多:Django旨在帮助开发人员尽快将应用程序从概念到完成
- 令人放心的安全:Django非常重视安全性,并帮助 开发人员避免许多常见的安全错误
- 超出可扩展性: Web上一些最繁忙的站点利用了Django快速扩展的能力
5、Django 可以使用什么Python版本?
- Django 的开发版本
6、Django 的安装
#在线安装Django,指定版本安装,可以根据自己的需求安装匹配的版本,我在这里安装的是Django2.2版本,
#安装命令如下:
pip install django==2.2
注:如果你是在Pycharm中第一次新建Django项目的话,会出现如下的界面:
如果网络良好,会安装成功,但也会比较耗时,如果网络不良好,直接会提示安装失败,另外,这种情况下安装的Djange默认会安装最新版本的,可能与要做的项目不匹配,会出现问题,如何解决呢:
如果网络良好并且已经安装成功,那么就在命令行先卸载:pip uninstall Django,然后再重新安装:pip install Django==2.2,即可。
如果创建项目时安装失败了,那么就直接在命令行执行命令:pip install Django==2.2,就可以。
我这里安装过了,再次安装就会提示安装过了。
二、Django快速入门: 后台管理
1、项目的创建与运行
django-admin startproject BookManage
- manage.py :一个命令行工具,可以使你用多种方式对 Django 项目进行交互
- 内层的目录:项目的真正的Python包
- __init__.py :一个空文件,它告诉Python这个目录应该被看做一个Python包
- settings.py :项目的配置
- urls.py :项目的URL声明
- wsgi.py :项目与 WSGI 兼容的Web服务器入口
2、应用的创建和使用
- 在一个项目中可以创建一到多个应用,每个应用进行一种业务处理
- 创建应用的命令:
python3 manage.py startapp bookApp
- 应用的目录结构如下图 :
from django.http import HttpResponse
from django.shortcuts import render
def index(request):
return HttpResponse("欢迎进入图书管理系统!")
# bookApp/urls.py
from django.conf.urls import url
from . import views
# /post/1/
urlpatterns = [
url(r'^$', views.index, name='index'),
# ^: 以什么开头, $是以什么结尾。 [0-9]指单个数字, +代表前面的字符出现1次或者多次。
# [0-9]+: 1, 2, 2344, 78888,
# (?P<id>[0-9]+) 关键字匹配
# /post/1/ ====> 1满足正则规则的, 将id=1
url(r'^post/(?P<id>[0-9]+)/$', views.detail, name='detail')
]
# BookManage/urls.py
from django.conf.urls import url
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 当用户访问的url地址以book开头, 请访问bookApp.urls这个url配置文件进行匹配并执行对应
的视图函数.
url(r'^book/', include('bookApp.urls')),
]
- include()函数允许引用其他 URLconfs 。
$ python3 manage.py runserver
- 访问 url 地址: http:// 127.0.0.1:8000/book/ 如果看到主页内容 图书管理系统 即成功。
- regex : 正则表达式,与之匹配的 URL 会执行对应的第二个参数 view。
- view : 用于执行与正则表达式匹配的 URL 请求。
- kwargs : 视图使用的字典类型的参数。
- name : 用来反向获取 URL。
3、 项目的数据库模型
MariaDB [(none)]> create database BookManage charset=utf8;
- 在 settings.py 文件中,通过DATABASES项进行数据库设置
- Django 支持的数据库包括: sqlite 、 mysql 等主流数据库
- Django 默认使用 **SQLite** 数据库
- Django数据库设置参考文档
- 'django.db.backends.postgresql'
- 'django.db.backends.mysql'
- 'django.db.backends.sqlite3'
- 'django.db.backends.oracle'
# .......
# 注释之前的sqlite数据库;
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
# 添加新的Mysql数据库连接;
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'BookManage',
'USER': 'root',
'PASSWORD': 'westos',
'HOST': 'localhost',
'PORT': '3306',
}
}
# .......
$ pip install pymysql
import pymysql
# MySQLdb只支持Python2.*,还不支持3.可以用PyMySQL代替。
pymysql.install_as_MySQLdb()
- 图书表结构设计: 表名: Book
- 英雄表结构设计: 表名: Hero
# bookApp/models.py
from django.db import models
# Create your models here.
class Book(models.Model):
# 定义属性:默认主键自增id字段可不写
title = models.CharField(max_length=20)
pub_date = models.DateTimeField()
# 定义默认输出格式
def __str__(self):
return "%d" % self.title
# 自定义对应的表名,默认表名:bookApp_book
class Meta:
db_table = "books"
class Hero(models.Model):
name = models.CharField(max_length=20)
gender = models.BooleanField()
content = models.CharField(max_length=100)
Book = models.ForeignKey('Book', on_delete=False)
def __str__(self):
return "%s" % self.name
# 自定义对应的表名,默认表名:bookApp_hero
class Meta:
db_table = "heros"
- 激活模型:编辑 settings.py 文件,将应用加入到 INSTALLED_APPS 中
# BookManage/settings.py
# Application definition
INSTALLED_APPS = [
# .......此处省略
'django.contrib.staticfiles',
# 新添加的app
'bookApp',
]
- 生成迁移文件:根据模型类生成 sql 语句
python manage.py makemigrations
![](https://img-blog.csdnimg.cn/20200319140428401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaWRhZGVndWFpZ3VhaQ==,size_16,color_FFFFFF,t_70)
- 执行迁移:执行 sql 语句生成数据表
python manage.py migrate
$ mysql -uroot -pwestos
MariaDB [(none)]> use BookManage
MariaDB [BookManage]> show tables;
MariaDB [BookManage]> desc books;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(20) | NO | | NULL | |
| pub_date | datetime | NO | | NULL | |
+----------+-------------+------+-----+---------+----------------+
MariaDB [BookManage]> desc heros;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| gender | tinyint(1) | NO | | NULL | |
| content | varchar(100) | NO | | NULL | |
| Book_id | int(11) | NO | MUL | NULL | |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
- 现在进入交互式的Python shell,并使用 Django 提供的免费 API
python manage.py shell
- 引入需要的包:
from bookApp.models import Hero, Book
- 查询所有图书信息:
Book.objects.all()
- 新建图书信息:
from datetime import datetime
book = Book(title="射雕英雄传", pub_date=datetime(year=1990,month=1,day=10))
book.save()
- 查找图书信息:
book = Book.objects.get(pk=1)
book.id
book.title
book.pub_date
- 修改图书信息:
book.title = "天龙八部"
book.save()
- 删除图书信息:
book.delete()
- 添加关联对象
# 书籍的创建
book = Book(title="倚天屠龙记", pub_date=datetime(year=1990,month=1,day=10))
book.save()
# 人物的创建
info1 = "峨眉第四代掌门人,先为峨眉派掌门灭绝师太的徒儿,颇获灭绝师太欢心并对她>青睐有加,将峨
眉派镇派之宝“蛾眉九阳功”传给了她,张无忌的追求者之一。"
info2 = "原名敏敏特穆尔,汝阳王(朝廷大将军察罕特穆尔)的女儿,封号“绍敏郡主”,>赵敏是她的汉
名,是从她的封号“绍敏郡主”而来。"
hero1 = Hero(name="周芷若", gender=False, info=info1)
hero2 = Hero(name="赵敏", gender=False, info=info2)
hero1.Book=book
hero2.Book=book
hero1.save()
hero2.save()
- 获得关联集合:返回当前book对象的所有hero
- 有一个 Hero 存在,必须要有一个 Book 对象,提供了创建关联的数据:
book.hero_set.create(name="张无忌",
gender=True,
content="武当派第二代“张五侠”张翠山与天鹰教紫微堂堂主殷素素的儿子")
四、 启用后台Admin 站点管理
- 站点分为“内容发布(后台管理)”和“公共访问(前台管理)”两部分
- “内容发布”的部分负责添加、修改、删除内容,开发这些重复的功能是一件单调乏味、缺乏创造力
- 的工作。
- 因此, Django 会根据定义的模型类完全自动地生成管理模块
![](https://img-blog.csdnimg.cn/20200319145730821.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaWRhZGVndWFpZ3VhaQ==,size_16,color_FFFFFF,t_70)
1. 数据库迁移
python manage.py makemigrations
python manage.py migrate
2. 创建管理员用户
# 按提示输入用户名、邮箱、密码
python manage.py createsuperuser
- 启动服务器,通过 “127.0.0.1:8000/admin” 访问,输入上面创建的用户名、密码完成登录
- 进入管理站点,默认可以对 groups、users 进行管理
3. 管理界面本地化
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
4. 自定义模型加入后台管理
from django.contrib import admin
from models import Book
admin.site.register(Book)
- 刷新管理页面,可以对 Book 的数据进行增删改查操作 ;
- 问题一: python2 版本中, 如果在 str 方法中返回中文,在修改和添加时会报 ascii 的错误
- 在 str() 方法中,将字符串末尾添加 “.encode('utf-8')” 进行字符串编码
- 问题二: 后台管理时, Book管理显示的是英文, 如何变成中文?
# bookApp/models.py
class Book(models.Model):
# ........此处省略
# 自定义对应的表名,默认表名:bookApp_book
class Meta:
db_table = "books"
# 单数时显示的名称
verbose_name = '图书信息'
# 复数时显示的名称
verbose_name_plural = '图书信息'
![](https://img-blog.csdnimg.cn/20200319150250528.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaWRhZGVndWFpZ3VhaQ==,size_16,color_FFFFFF,t_70)
5. 自定义管理页面
- Django 提供了 admin.ModelAdmin 类
- 通过定义 ModelAdmin 的子类,来定义模型在 Admin 界面的显示方式
# bookApp/admin.py
from django.contrib import admin
from .models import Book, Hero
# 书籍自定义管理页面
class BookAdmin(admin.ModelAdmin):
list_display = ['pk', 'title', 'pub_date']
list_filter = ['title']
search_fields = ['title']
list_per_page = 10
# fields = ['pub_date', 'title']
fieldsets = [('基础信息', {'fields': ['title']}),
('详细信息', {'fields': ['pub_date']}), ]
# 人物自定义管理页面
class HeroAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'gender', 'content']
list_filter = ['name']
search_fields = ['name']
list_per_page = 10
# 关联注册
admin.site.register(Book, BookAdmin)
admin.site.register(Hero, HeroAdmin)
- list_display:显示字段,可以点击列头进行排序
list_display = ['pk', 'title', 'pub_date']
- list_fifilter:过滤字段,过滤框会出现在右侧
list_filter = ['title']
- search_fifields:搜索字段,搜索框会出现在上侧
search_fields = ['title']
- list_per_page:分页,分页框会出现在下侧
list_per_page = 10
- fifields:属性的先后顺序
- fieldsets :属性分组, 注意: fields和fieldsets 只能设置一个.
![](https://img-blog.csdnimg.cn/20200319151326483.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaWRhZGVndWFpZ3VhaQ==,size_16,color_FFFFFF,t_70)
- 方式一:与 Book 模型类相同
- 方式二:关联注册
# bookApp/admin.py
# class HeroInline(admin.TabularInline):
class HeroInline(admin.StackedInline):
model = Hero
extra = 2
class BookAdmin(admin.ModelAdmin):
list_display = ['pk', 'title', 'pub_date']
# .......此处省略部分重复代码
inlines = [HeroInline]
![](https://img-blog.csdnimg.cn/20200319151503926.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaWRhZGVndWFpZ3VhaQ==,size_16,color_FFFFFF,t_70)
- 发布性别的显示不是一个直观的结果,可以使用方法进行封装
# bookApp/models.py
class Hero(models.Model):
# .......此处省略部分重复代码
def sex(self):
if self.gender:
return "男"
else:
return "女"
- 在 admin 注册中使用 sex 代替 gender
# bookApp/admin.py
class HeroAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'sex', 'content']
# .......此处省略部分重复代码
- 显示效果如下:
五、Django快速入门: 前台管理
1、URLconf 路由管理
- 在 Django 中,定义 URLconf 包括正则表达式、视图两部分 。
- Django 使用正则表达式匹配请求的URL,一旦匹配成功,则调用应用的视图 。
- 注意:只匹配路径部分,即除去域名、参数后的字符串 。
- 在主配置文件中添加子配置文件,使主 urlconf 配置连接到子模块的 urlconf 配置文件 。
# BookManage/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
# 当用户访问的url地址以book开头, 请访问bookApp.urls这个url配置文件进行匹配并执行对应
的视图函数.
url(r'^book/', include('bookApp.urls')),
]
# bookApp/urls.py
urlpatterns = [
# 当用户访问bookApp应用的主页时, 执行视图函数index,反向根据名称获取url地址;
url(r'^$', views.index, name='index'),
# 显示书籍的详情页
url(r'^([0-9]+)/$', views.detail, name='detail'),
]
2、视图函数处理业务逻辑
- 在 Django 中,视图对WEB请求进行回应( response )。
- 视图接收 reqeust 请求对象作为第一个参数,包含了请求的信息 。
- 视图函数就是一个Python函数,被定义在 views.py 中 。
- 定义完成视图后,需要配置 urlconf ,否则无法处理请求。
# bookApp/views.py
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse("图书管理系统")
def detail(request, id):
return HttpResponse("图书管理详情页信息 %s" % id)
- http://127.0.0.1:8000/book/detail/2/
- http://127.0.0.1:8000/book/
from django.shortcuts import render
from django.http import HttpResponse
from bookApp.models import Book
def index(request):
booklist = Book.objects.all()
return render(request, 'book/index.html', {'booklist': booklist})
# return HttpResponse("图书管理系统")
def detail(request, id):
book = Book.objects.get(pk=id)
return render(request, 'book/detail.html', {'book': book})
# return HttpResponse("图书管理详情页信息 %s" % id)
3、 模板管理实现好看的HTML页面
![](https://img-blog.csdnimg.cn/20200319153450970.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaWRhZGVndWFpZ3VhaQ==,size_16,color_FFFFFF,t_70)
- 修改 BookManage/settings.py 文件,设置 TEMPLATES 的 DIRS 值
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 修改的部分,指定模板路径
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# ..................
},
]
(2) 模板语法: 变量
- 变量输出语法
{ { var } }
- 当模版引擎遇到一个变量,将计算这个变量,然后将结果输出。
- 变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。
- 当模版引擎遇到点("."),会按照下列顺序查询:
- 如果变量不存在, 模版系统将插入'' (空字符串)。
- 语法
{ % tag % }
- 作用
{% for ... in ... %}
循环逻辑
{% endfor %}
if标签
{% if ... %}
逻辑1
{% elif ... %}
逻辑2
{% else %}
逻辑3
{% endif %}
comment标签
{% comment %}
多行注释
{% endcomment %}
include标签
- 加载模板并以标签内的参数渲染
{% include "base/left.html" %}
url :反向解析
{% url 'name' p1 p2 %}
csrf_token 标签
- 用于跨站请求伪造保护
{% csrf_token %}
4、主页与详情页前端HTML设计
![](https://img-blog.csdnimg.cn/20200319154658428.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RhaWRhZGVndWFpZ3VhaQ==,size_16,color_FFFFFF,t_70)
- 定义 **index.html** 模板
<!DOCTYPE html>
<html>
<head><title>首页</title></head>
<body>
<h1>图书列表</h1>
<ul>
{% for book in booklist %}
<li><a href="{{ book.id }}"> {{ book.title }} </a></li>
{% endfor %}
</ul>
</body>
</html>
- 定义 **detail.html** 模板
<!DOCTYPE html>
<html>
<head><title>详细页</title></head>
<body>
<h1>{{ book.title }}</h1>
<ul>
{% for hero in book.hero_set.all %}
<li>{{ hero.name }}---{{ hero.sex }}----{{ hero.content }}</li>
{% endfor %}
</ul>
</body>
</html>
- http://127.0.0.1:8000/book/
六、Django请求的生命周期
- wsgi : 封装请求后交给后端的web框架( Flask、Django )。
- 请求中间件: 对请求进行校验或在请求对象中添加其他相关数据,例如: csrf、
- request.session 。
- 路由匹配: 根据浏览器发送的不同 url 去匹配不同的视图函数。
- 视图函数: 在视图函数中进行业务逻辑的处理,可能涉及到: ORM、Templates 。
- 响应中间件: 对响应的数据进行处理。
- wsgi : 将响应的内容发送给浏览器。
七、总结
- 安装配置 django 运行的环境
- 编写模型,使用简单 API 与数据库交互
- 使用 Django 的后台管理中维护数据
- 通过 视图 接收请求,通过模型获取数据,展示出来
- 调用模板完成展示