TypechoJoeTheme

快把钟哥带走

zyz

网站页面
标签搜索

01-Django环境及基本流程

zyz
2018-06-01
/
0 评论
/
1,046 阅读
/
正在检测是否收录...
06/01

一、Django简介

Django是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!

初次发布于2005年7月,并于2008年发布了第一个正式版本1.0。

二、Django特点

  • 强大的数据库功能: 拥有强大的数据库操作接口(QuerySet API),如需要也能执行原生SQL。
  • 自带强大的后台: 几行简单的代码就让你的网站拥有一个强大的后台,轻松管理内容!
  • 优雅的网址: 用正则匹配网址,传递到对应函数,随意定义,如你所想!
  • 模板系统: 强大,易扩展的模板系统,设计简易,代码,样式分开设计,更容易管理。
    (注:前后端分离时,也可以用Django开发API,完全不用模板系统。)
  • 缓存系统,与Memcached, Redis等缓存系统联用,更出色的表现,更快的加载速度。
  • 国际化,完全支持多语言应用,允许你定义翻译的字符,轻松翻译成不同国家的语言。

三、MVC模式

MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件中,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

- Model(模型)
    应用程序中用于处理应用程序数据逻辑部分;
    通常模型对象负责在数据库中存取数据;
- View(视图)
    应用程序中处理数据显示部分;
    通常视图是依据模型数据创建的;
- Controller(控制器)
    应用程序中处理用户交互部分;
    通常控制器负责从视图中读取数据,控制用户输入,并向模型发送数据;

优点: 降低各个功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用。

四、MTV模式

本质上MTV与MVC模式没有什么区别,也是各组件之间为了保持松耦合关系,只是定义上有些不同。

- Model(模型)
    负责业务对象与数据库对象(ORM)
- Template(模板)
    负责如何把页面展示给用户
- View(视图)
    负责业务逻辑,并在适当的时候调用Model和Template

Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template。

五、Django环境搭建

  • Django版本选择
Django 1.5.x 支持 Python 2.6.5 Python 2.7, Python 3.2 和 3.3.
Django 1.6.x 支持 Python 2.6.X, 2.7.X, 3.2.X 和 3.3.X
Django 1.7.x 支持 Python 2.7, 3.2, 3.3, 和 3.4 (注意:Python 2.6 不支持了)
Django 1.8.x 支持 Python 2.7, 3.2, 3.3, 3.4 和 3.5.  (长期支持版本 LTS)
Django 1.9.x 支持 Python 2.7, 3.4 和 3.5. 不支持 3.3 了
Django 1.10.x 支持 Python 2.7, 3.4 和 3.5
Django 1.11.x 支持 Python 2.7, 3.4, 3.5 和 3.6(长期支持版本 LTS)
Django 2.0.x 支持 Python 3.4, 3.5 和 3.6 (注意,不再支持 Python 2)
  • pip安装(如果有直接跳过)
- 下载get-pip.py文件(Linux, Mac OSX, Windows都可用) 
    https://bootstrap.pypa.io/get-pip.py
- 安装(在终端中运行)
    $ python get-pip.py
备注:
    当Python2.x和Python3.x共存的时候要区分是哪个版本需要安装;

pip更新(Linux或MacOS): pip install -U pip

pip更新(Windows): python -m pip install -U pip

  • 安装Django
- 安装
    $ pip install Django==1.11.4
- 验证是否成功()
    进入到python环境(终端中输入python)
    >>> import django
    >>> django.get_version()
    '1.11.4'

六、Django项目创建

新建Django项目:
    $ django-admin startproject projectName
目录层级说明:
    manage.py 一个命令行工具,可以使我们多种方式对Django项目进行交互
    projectName/__init__.py 一个空文件,告诉python这个目录被看做一个python包(有这个能称之为包)
    projectName/settings.py 项目的配置文件
    projectName/urls.py     项目URL声明
    projectName/wsgi.py     项目与WSGI兼容的Web服务器入口

备注: Linux或Mac下,直接在终端中操作;而在Windows中在cmd中操作(开始 -> 搜索cmd)

七、设计表结构

  • 班级表
表名: grades
字段: 序号id、班级名gname、开班时间gdate、男生数量gboynum、女生数量ggirlnum、是否删除isdel
  • 学生表
表名: students
字段: 序号id、学生名sname、性别ssex、年龄sage、班级sclass、简介sbrief、是否删除isdel

八、配置数据库

  • __init__中添加两行代码 (确保安装mysql,另外需要pip3 install pymysql)
import pymysql
pymysql.install_as_MySQLdb()

python3安装的是PxMysql (和python2是不一样的)

  • settings.py中修改默认数据库
DATABASES = {
    'default': {
        # 修改为mysql
        'ENGINE': 'django.db.backends.mysql',
        # 必须先创建有对应的数据库
        'NAME': 'zyz',
        # 用户名
        'USER': 'root',
        # 密码
        'PASSWORD': '123456’,
        # 主机
        'HOST': '127.0.0.1',
        # 端口号
        'POST': '3306’
    }
}

Django默认使用SQLine数据库

九、创建应用

要先进入项目目录下,cd projectName 然后执行下面的命令:

$ python3 manage.py startapp appName

项目文件说明: 
    admin.py 站点配置
    models.py 模型
    views.py 视图

其实一个项目中可以创建多个应用;

十、激活应用

settings.py文件中,将appName应用加入到INSTALL_APPS选项中.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'appName'    # 添加自己的应用
]

十一、定义模型

  • 班级表
# 班级表Grades
class Grades(models.Model):
    # 对应字段,以及字段类型
    # id          = models.IntegerField()
    gname       = models.CharField(max_length=30)
    gdate       = models.DateField()
    gboynum     = models.IntegerField()
    ggirlnum    = models.IntegerField()
    isdel       = models.BooleanField(default=False)

需要引入from django.db import models。模型类要继承models.Model类。

  • 学生表
# 学生表Students
class Students(models.Model):
    # 自定义模型管理器
    studentObj1 = models.Manager()
    studentObj2 = StudentsManager()

    # 在没有添加主键时,它会在生成时自动添加主键
    # id          = models.IntegerField()
    sname       = models.CharField(max_length=30)
    ssex        = models.CharField(max_length=10)
    sage        = models.IntegerField()
    sbrief      = models.CharField(max_length=50)
    isdel       = models.BooleanField(default=False)

    # 关联外键(学生都会有一个班级)
    sclass = models.ForeignKey('Grades')

十二、数据库中生成对应表单

  • 生成迁移文件
$ python3 manage.py makemigrations

备注: 在migrations目录中生成一个迁移文件,此时数据库中还没生成表单
  • 执行迁移
$ python3 manage.py migrate

备注: 相当于执行了MySQL语句创建了表单(appname_students、appname_grades)

十三、测试数据库表单操作

- 进入到Python shell
    $ python3 manage.py shell
    
- 引入包
    from myapp.models import Grades,Students
    from django.utils import timezone
    from datetime import *

- 查询所有数据
    Grades.objects.all()
    备注: 在模型类中,其实会有一个隐藏属性objects

- 添加数据(创建对象)
    >>> grade = Grades()
    >>> grade.gname = 'python04'
    >>> grade.gdate = datetime(year=2018,month=5,day=27)
    >>> grade.gboynum = 30
    >>> grade.ggirlnum = 20
    >>> grade.save()    # 只有执行保存,才会往数据库中插入数据
    备注: 添加数据本质,就是创建一个模型类的对象实例

- 查看数据(查看对象)
    Grades.objects.get(pk=1)
    Grades.objects.get(pk=2)

- 修改数据(修改对象属性)
    g = Grades.objects.get(pk=1)
    g.gboynum = 70    
    g.save()
    
- 删除数据
    g.delete()    # 物理删除,即数据库中表单数据被删除


- 关联对象
    # 获取到班级对象 (pk即是id那个字段)
    >>> grade = Grades.objects.get(pk=2)
    # 添加学生对象
    >>> stu1 = Students()
    >>> stu1.sname = '王大帅'
    >>> stu1.ssex = '男'
    >>> stu1.sage = 18
    >>> stu1.sbrief = '我住隔壁,我姓王,你有事情我帮忙'
    >>> stu1.sclass = grade        # 这个即是关联上对象,如果没有管理,执行save会报错
    >>> stu.save()


    >>> stu2 = Students()
    >>> stu2.sname = '李花花'
    >>> stu2.ssex = '女'
    >>> stu2.sage = 18
    >>> stu2.sbrief = '你负责赚钱养家,我负责貌美如花.'
    >>> stu2.sclass = grade
    >>> stu2.save()
    
- 获取关联对象
    语法: 
        对象.关联的类名小写_set.all()
    例如: 
         grade.students_set.all()
    备注: 在班级中,想要获取某个班级中关联的学生信息


    需求: python04班级存在,    如何快速关联上快速创建对应学生?            # 可以直接通过以下方法创建,并且不需要调用保存 (但班级是python04而不是python05)
    # 其实就是直接grade和创建的学生对象关联起来了
    stu3 = grade.students_set.create(sname='王八',ssex='男',sage=20,sbrief='哈哈,咬我啊..')

十四、启动服务器

语法:
    python3 manage.py runserver ip:port
例如:
    python3 manage.py runserver
备注:
    IP可以不写,代表即是本机IP
    端口号默认是8000
    启动成功后,在浏览器可以看到”It worked!”
说明:
    这是一个纯python写的轻量级web服务器,仅仅在开发测试阶段中使用

十五、Admin站点管理(后台可视化界面操作)

  • 概述
内容发布: 负责添加、修改、删除内容
公告访问
  • 配置Admin应用
在`settings.py`文件中的IINSTALLED_APPS中添加'django.contrib.admin' (默认是已经是添加好的)
  • 创建管理员用户
$ python3 manage.py createsuperuser
  • 访问站点管理
语法: ip:端口号/admin
例如: 192.168.0.13:8000/admin
  • 站点管理的汉化版
在settings.py中替换以下内容即可
    LANGUAGE_CODE = 'en-us' 替换 LANGUAGE_CODE = 'zh-Hans'
    TIME_ZONE = 'UTC' 替换 TIME_ZONE = 'Asia/Shanghai'
  • 管理数据表(后台界面中)
修改admin.py文件:
    # 引入
    from .models import Grades,Students
    # 注册
    admin.site.register(Grades)
    admin.site.register(Students)
  • 自定义管理数据页面(因为原本页面显示不够友好)
# 自定义管理数据页面
# 该类需要注册时添加进去
class GradesAmin(admin.ModelAdmin):
    # 列表页的属性
    # 显示字段(需要显示什么字段,就写上什么字段即可)
    list_display = ['pk','gname','gdate','gboynum','ggirlnum','isdel']
    # 过滤器(过滤字段)
    list_filter = ['gname']
    # 搜索字段
    search_fields = ['pk']
    # 分页(多少条为一页)
    list_per_page = 5


    # 添加、修改页属性
    # 属性的先后顺序
    fields = ['gboynum','gname','gdate','ggirlnum','isdel']
    # 给属性分组(fields和fieldsets不能同时使用)
    fieldsets = [
                ('num',{'fields':['gboynum','ggirlnum']}),
                ('base',{'fields':['gname','gdate','isdel']}),
    ]


# 注册(以后其实不会在这里完成注册,会通过装饰器完成注册!)
admin.site.register(Grades,GradesAmin)
  • 自定义管理页面(关联对象)
需求: 在创建班级时,可以直接添加几个学生
# TabularInline 或 StackedInline 两种显示方式
class StudentsInfo(admin.TabularInline):
    # 要创建学生
    model = Students
    # 需要创建几个
    extra = 1
    
# 与Grades关联上
class GradesAmin(admin.ModelAdmin):
    # 与上面关联上
    inlines = [StudentsInfo]
  • 自定义管理页面(布尔类型的显示问题)
class StudentsAdmin(admin.ModelAdmin):
    def isdel(self):
        if self.isdel == False:
            return "删除"

# 设置页面列的名称
isdel.short_description = '是否删除'
  • 自定义管理页面(执行动作的位置)
# 将动作位置放置底部
class StudentsAdmin(admin.ModelAdmin):
    # 执行动作的位置
    actions_on_bottom = True
    actions_on_top = False

十六、使用装饰器完成注册

# 自定义管理数据页面
@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):

十七、视图基本使用

  • 概述
在Django中,视图对web请求进行回应;
视图其实就是一个python函数,在views.py文件中定义;

备注: 有几个页面就有几个视图

  • 定义视图
from  django.http import HttpResponse
# 没有使用任何的模板
def index(request):
    return HttpResponse('hello zyz!!!')
  • 配置url (简单)
# 修改project/urls.py文件
from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('myapp.urls')),   # 会定位到myapp.urls中
]


# 在对应应用中appname中,创建urls.py文件(与上面文件类似)
from django.conf.urls import url
from . import views     # 导入视图

urlpatterns = [
    url(r'^$', views.index)    # 匹配到的就是views中的首页
]
  • 配置url (带参数)
# 描述(在views.py中定义的视图)
def detail(request,num):
    return HttpResponse('detail-%s' % num)


# 在appname/urls.py中配置即可        
urlpatterns = [
    url(r'^$', views.index), 
    # 添加括号,其实就是正则表达式中的组的概念。
    # 而匹配到的就是可以给到 detail(request,num) 函数中的num
    url(r'^(\d+)/$', views.detail)
]

十八、模板的基本使用

  • 概念
模板是HTML页面,可以根据视图中传递过来的数据进行填充
  • 创建模板目录
在project中创建模板目录templates;
在templares目录中,创建对应应用目录appname作为项目模板目录;

创建对应应用app的目录,因为一个项目可以创建多个app,这也方便对应

  • 配置模板路径
# 修改settings.py文件中的TEMPLATES;
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    # 添加模板目录
    # 开头部分都有定义BASE_DIR,即项目其实目录
    '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',
        ],
    },
},
]
  • 模板语法
{{输出值,变量或对象属性}}
{%执行代码段%}
  • 需求1
# 在网址中输入127.0.0.1/grades时,将所有班级显示出来
# 在网址中输入127.0.0.1/students时,将所有学生显示出来
- 先创建一个模板(project/templates/appname/)
    grades.html
    students.html
- 模板代码(基本页面显示)
- 创建对应视图
    # 班级页
    def grades(request):
        pass
- url控制器(在myapp/urls.py中分发)
    url(r'^grades/$', views.grades),
- 视图中的具体操作
    # 班级页
    from .models import Grades
    def grades(request):
        # 通过模型取出数据库中对应表单数据
        gradeList = Grades.objects.all()

        # 将数据传递给模板(模板将数据渲染上之后再返回)
        return render(request,'myapp/grades.html',{'grades': gradeList})
  • 需求2
# 在班级信息中点击时,显示对应班级信息
- 每个班级点击时,URL都会有变化
    <a href="{{grade.id}}">{{grade.gname}}</a>

- 匹配不同的视图
    url(r'^grades/(\d+)$', views.gradeStudents),        # 班级对应学生页

- 视图中的具体操作
# 对应班级的学生信息
    def gradeStudents(request,gradeid):
        # 获取对应班级对象
        grade = Grades.objects.get(pk=gradeid)
        # 对应班级的学生
        studentList = grade.students_set.all()

        # 都是学生信息都是一样显示(即模板是一致的)
        # 就是数据源不一样
        return render(request,'myapp/students.html',{'students':studentList})
赞(0)
评论 (0)