Django(Python Web框架)学习(二)快速入门

 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快速入门: 后台管理

通过简单示例,使用 Django 完成基本流程的开发,学习 Django 的主要的知识点,在后续文章中会逐个知识点进行深入讲解 , 本次入门以图书管理系统为示例 , 实现图书管理的基本功能。

1、项目的创建与运行

第一次使用 Django ,那么你必须要照顾一些初始设置。也就是说,您需要自动生成一些建立 Django项目的代码。
从命令行 cd 到您要存储代码的目录,然后运行以下命令:
 
django-admin startproject BookManage
进入项目目录,目录结构如下图:
 

                                 

目录说明:
  • manage.py :一个命令行工具,可以使你用多种方式对 Django 项目进行交互
  • 内层的目录:项目的真正的Python
  • __init__.py :一个空文件,它告诉Python这个目录应该被看做一个Python
  • settings.py :项目的配置
  • urls.py :项目的URL声明
  • wsgi.py :项目与 WSGI 兼容的Web服务器入口

2、应用的创建和使用

(1) 创建第一个应用程序
Django 自带一个实用程序,可以自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不
是创建目录。
  • 在一个项目中可以创建一到多个应用,每个应用进行一种业务处理
  • 创建应用的命令:
python3 manage.py startapp bookApp
  •  应用的目录结构如下图 :

                           

(2) 编写第一个视图函数
我们来写第一个视图。打开文件 blog /views.py 并放入以下 Python 代码:
from django.http import HttpResponse
from django.shortcuts import render

def index(request):
    return HttpResponse("欢迎进入图书管理系统!")
(3) 路由规则
要在bookApp目录中创建一个 URLconf ,创建一个名为 urls.py 。如下所示:
# 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/settings 可知路由查找的主文件是 BookManage/urls.py , 因此在该文件添加一条 url 规则:
 
# 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
(4) 效果展示
启动服务器
$ python3 manage.py runserver

                       

  • 访问 url 地址: http:// 127.0.0.1:8000/book/ 如果看到主页内容 图书管理系统 即成功。

              

(5)url() 函数介绍
Django url() 可以接收四个参数,分别是两个必选参数: regex view 和两个可选参数:kwargs 、 name
  • regex : 正则表达式,与之匹配的 URL 会执行对应的第二个参数 view
  • view : 用于执行与正则表达式匹配的 URL 请求。
  • kwargs : 视图使用的字典类型的参数。
  • name : 用来反向获取 URL

3、 项目的数据库模型

(0). 数据库创建
MariaDB [(none)]> create database BookManage charset=utf8;
(1). 连接 MySQL 数据库配置
 
  • settings.py 文件中,通过DATABASES项进行数据库设置
  • Django 支持的数据库包括: sqlite mysql 等主流数据库
  • Django 默认使用 **SQLite** 数据库
  • Django数据库设置参考文档
其中 ENGINE 设置为数据库后端使用。内置数据库后端有:
  • 'django.db.backends.postgresql'
  • 'django.db.backends.mysql'
  • 'django.db.backends.sqlite3'
  • 'django.db.backends.oracle'
BookManage/settings.py 文件中,通过 DATABASES 项进行数据库设置 :
 
# .......
# 注释之前的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',
}
}
# .......
 
注意: Django 使用 MySQL 数据库需要安装 PyMySQL ,若已经安装请略过。
 
 
$ pip install pymysql
打开 BookManage/__init__.py ,写入以下代码导入 pymysql
 
 
import pymysql
# MySQLdb只支持Python2.*,还不支持3.可以用PyMySQL代替。
pymysql.install_as_MySQLdb()
(2). 创建数据库模型
本示例完成 图书 - 英雄 信息的维护,需要存储两种数据:图书、英雄
  • 图书表结构设计: 表名: Book
              图书名称: title
              图书发布时间: pub_date
  • 英雄表结构设计: 表名: Hero
             英雄姓名: name
             英雄性别: gender
             英雄简介: hcontent
             所属图书: hbook
图书 - 英雄的关系为一对多
 
# 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"
(3). 生成数据库表
  • 激活模型:编辑 settings.py 文件,将应用加入到 INSTALLED_APPS
# BookManage/settings.py
# Application definition
INSTALLED_APPS = [
# .......此处省略
'django.contrib.staticfiles',
# 新添加的app
'bookApp',
]
  • 生成迁移文件:根据模型类生成 sql 语句
python manage.py makemigrations
产生的迁移文件如下
 
                        
 
 
  • 执行迁移:执行 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)
(4). 数据库模型基本操作
  • 现在进入交互式的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 会根据定义的模型类完全自动地生成管理模块
Django 框架中有一个非常强大的应用功能 : 自动管理界面。 常被 Web 平台管理者使用,去管理整个Web平台。
默认情况下,在 settings.py 配置文件中 INSTALLED_APPS 包含以下应用程序,为了后续的开发,默认这些应用程序都是包含在里面的。
                                
 

1. 数据库迁移

使用这些 Django 自带的应用程序,需要我们在数据库中创建一些数据表对应,然后才能使用它们。
python manage.py makemigrations
python manage.py migrate

2. 创建管理员用户

# 按提示输入用户名、邮箱、密码
python manage.py createsuperuser
  • 启动服务器,通过 “127.0.0.1:8000/admin” 访问,输入上面创建的用户名、密码完成登录
  • 进入管理站点,默认可以对 groupsusers 进行管理

                                                     

3. 管理界面本地化

编辑 settings.py 文件,设置编码、时区
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'

4. 自定义模型加入后台管理

打开 bookApp/admin.py 文件,注册模型
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 = '图书信息'
 
效果如下 :
                                      
 

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:属性的先后顺序
fields = [ 'pub_date' , 'title' ]
 
  • fieldsets :属性分组, 注意: fieldsfieldsets 只能设置一个.
fieldsets = [( ' 基础信息 ' , { 'fields' : [ 'title' ]}),
                      ( ' 详细信息 ' , { 'fields' : [ 'pub_date' ]}), ]
 
                          
关联对象
对于 Hero 模型类,有两种注册方式
  • 方式一:与 Book 模型类相同
  • 方式二:关联注册
              admin.StackedInline : 内嵌关联注册类
              admin.TabularInline : 表格 关联注册类
 
# 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]
显示效果如下 :
 
                               
布尔值的显示
 
 
  • 发布性别的显示不是一个直观的结果,可以使用方法进行封装
# 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 子应用的子配置文件如下 :
 
 
# 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/
编辑 views.py 文件,在方法中调用模板 :
 
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页面

作为 Web 框架, Django 需要一种很便利的方法以动态地生成 HTML 。最常见的做法是使用模板。模板包含所需HTML 输出的静态部分,以及一些特殊的语法,描述如何将动态内容插入。
(1) 模板引擎配置
创建模板的目录如下图:
                                      
 
 
  • 修改 BookManage/settings.py 文件,设置 TEMPLATES DIRS
 
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 修改的部分,指定模板路径
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        # ..................
    },
]

(2) 模板语法: 变量

  • 变量输出语法
{ { var } }
  • 当模版引擎遇到一个变量,将计算这个变量,然后将结果输出。
  • 变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。
  • 当模版引擎遇到点("."),会按照下列顺序查询:
              字典查询,例如: foo["bar"]
              属性或方法查询,例如: foo.bar
              数字索引查询,例如: foo[bar]
  • 如果变量不存在, 模版系统将插入'' (空字符串)
(3) 模板语法 : 常用标签
 
  • 语法
{ % tag % }
  • 作用
                在输出中创建文本。
                 控制循环或逻辑。
                加载外部信息到模板中。
 
for 标签
{% 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设计

                                              
 
 
  • 定义 **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框架( FlaskDjango )。
  • 请求中间件: 对请求进行校验或在请求对象中添加其他相关数据,例如: csrf
  • request.session
  • 路由匹配: 根据浏览器发送的不同 url 去匹配不同的视图函数。
  • 视图函数: 在视图函数中进行业务逻辑的处理,可能涉及到: ORMTemplates
  • 响应中间件: 对响应的数据进行处理。
  • wsgi : 将响应的内容发送给浏览器。

七、总结

本系统基本功能已经完成, 前端页面可以搜索好看的 html 进行替换。
  • 安装配置 django 运行的环境
  • 编写模型,使用简单 API 与数据库交互
  • 使用 Django 的后台管理中维护数据
  • 通过 视图 接收请求,通过模型获取数据,展示出来
  • 调用模板完成展示 ​​​​​​
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
积极
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值