Django流程及数据库等各项配置

Django流程及数据库等各项配置

            Python的WEB框架有Django、Tornado、Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。
以下是使用的版本为1.11做的总结.

一、 Django流程介绍

Django流程及数据库等各项配置_第1张图片
 
    MVC模式,即:将应用程序分解成三个组成部分:model(模型),view(视图),和 controller(控制 器),其中:
  • C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。
  • M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作。
  • V全拼为View,用于封装结果,生成页面展示的html内容。

     Django也是一个MVC框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式
   
  • M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
  • V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
  • T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。
  • router 负责路由分发,实现前端请求找到视图函数
    
  二、 Django 基本配置

1. 创建django程序

  • 终端命令:
    django-admin startproject users  # 在当前目录下创建一个Django程序
  • 其他常用命令:
    python manage.py runserver ip:port  或 shift+F10  # 启动服务器,默认ip和端口为http://127.0.0.1:8000/
        
    python manage.py startapp appname  #  新建 app
    
    python manage.py makemigrations  # 显示并记录所有数据的改动
    
    python manage.py migrate  # 将改动更新到数据库
    
    python manage.py createsuperuser  # 创建超级管理员
    
    python manage.py dbshell  # 数据库命令行,不用另外打开终端,可以在PyCharm中操作数据库
    
    python manage.py  # 查看命令列表

2. 程序目录

Django流程及数据库等各项配置_第2张图片

3. 配置文件

     a、数据库
        支持SQLite 3(默认)、PostgreSQL 、MySQL、Oracle数据库的操作
# 默认是SQLit 3 的配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# MySQL的配置

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'books',   # 注意这里的数据库应该以utf-8编码,在创建数据库的时候需要指定编码
    'USER': 'root',  # 数据库的用户名
    'PASSWORD': '123456',  # 数据库的密码
    'HOST': '127.0.0.1',  # 指定ip
    'PORT': '3306',  # 指定端口
    }
}

# 对于python3的使用者们还需要再加一步操作
# 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
  
# 如下设置放置的与project同名的配置的 __init__.py文件中
# 作用是让Django的ORM能以mysqldb的方式来调用PyMySQL  
import pymysql 或 from pymysql import install_as_MySQLdb  
pymysql.install_as_MySQLdb()


# PostgreSQL配置
DATABASES = {
    'default': {
        'NAME': 'books',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'root',
        'PASSWORD': '123456'
    }


# Oracle配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'books',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '1521',
    }
}
Django框架对于开发者而言高度透明化,对于不同数据库的具体使用方 法是一致的,改变数据库类型只需要变动上述配置即可。
     b、静态文件添加
# 首先在项目根目录下创建static目录

# 接着在settings.py 文件下添加

STATIC_URL = '/static/'  # 默认已添加,使用静态文件时的前缀
STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'), # 由于是元组的格式,行末的逗号不能漏
    )

# 这样在template中就可以导入static目录下的静态文件啦

三、 Django 路由系统

        URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
URL的加载是从配置文件中开始。

Django流程及数据库等各项配置_第3张图片
参数说明:
  • 一个正则表达式字符串
  • 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
  • 可选的要传递给视图函数的默认参数(字典形式)
  • 一个可选的name参数, 用来反向获取url

 

1. 示例

# 在应用urls.py文件中

from django.conf.urls import url
   
from . import views
   
urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
说明:
请求示例:
  • 一个请求 /articles/2005/03/ 会匹配上面列表中的第三条. Django 会调用函数 views.month_archive(request, '2005', '03').
  • /articles/2005/3/ 不会匹配上面列表中的任何条目, 因为第三条的月份需要二位数字.
  • /articles/2003/ 会匹配上第一条而不是第二条,因为匹配是按照从上到下顺序而进行的, Django 会调用函数 views.special_case_2003(request)
  • /articles/2003 不会匹配上面列表中的任何条目, 因为每个URL应该以 / 结尾.
  • /articles/2003/03/03/ 会匹配上最后一条. Django 会调用函数 views.article_detail(request, '2003', '03', '03').

 2. 命名组(Named groups)


        在上面的简单例子中,并没有使用正则表达式分组,在更高级的用法中,很有可能使用正则分组来匹配URL并且将分组值通过参数传递给view函数。

在Python的正则表达式中,分组的语法是 (?Ppattern), name表示分组名,pattern表示一些匹配正则.

这里是一个简单的小例子:

Django流程及数据库等各项配置_第4张图片


常见写法实例:

Django流程及数据库等各项配置_第5张图片


 3. 二级路由(Including)

那如果映射 url 太多怎么办,全写一个在  urlpatterns 显得繁琐,so 二级路由应用而生
# dj_first/urls.py

from django.conf.urls import url, include
from django.contrib import admin


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 添加
    url(r"^users/", include('users.urls', namespace='users')),
]

# users/urls.py

from django.conf.urls import url
from . import views


urlpatterns = [
    # 添加
    url(r"^index/$", views.index, name='index'),  # 添加应用的路由
    url(r"^books/$", views.show_books, name='books'),  # 添加应用的路由
]

# users/views.py

def show_books(request):
    # books = BookInfo.objects.all()  # 在页面中展示刚才在Models.py中创建的BookInfo 数据
    data = {
        'city': '北京',
        'adict': {
            'name': '西游记',
            'author': '吴承恩'
        },
        'alist': [1, 2, 3, 4, 5]
    }
    return render(request, 'index.html', context=data)

        在上面这个例子中,如果请求url为  /users/books/  则会调用函数 show_books().

使用二级路由也可以减少代码冗余,使代码更加简洁易懂

4. 别名的使用


在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。

    1) 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如

url(r'^users/', include('users.urls', namespace='users')),

命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。

    2) 在定义普通路由时,可以使用name参数指明路由的名字,如

urlpatterns = [
    # 添加
    url(r"^index/$", views.index, name='index'),  # 添加应用的路由
    url(r"^books/$", views.show_books, name='books'),  # 添加应用的路由
]

   3) reverse反解析及重定向

Django流程及数据库等各项配置_第6张图片

四、 视图函数(Views)

def index(request):
    """
    index 视图函数名
    :param request: 包含了请求信息的请求对象
    :return:  响应对象
    """
    return HttpResponse('hello world')

说明:

  • 视图函数的第一个传入参数必须定义,用于接收Django构造的包含了请求数据的HttpReqeust对象,通常名为request
  • 视图函数的返回值必须为一个响应对象,不能像Flask一样直接返回一个字符串,可以将要返回的字符串数据放到一个HTTPResponse对象中。


五、 模板(Template)

1. 模板的执行

        模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户。
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',
            ],
        },
    },
]
# view.py

def index(request):
    return render(request, 'index.html', {'title':'welcome'})


# index.html




    
    Title


    

{{ title }}

2.  模板语言

模板中也有自己的语言,该语言可以实现数据展示

{% for book in books %}
    
  • {{ book }}
  • {% endfor %} {{ books }}

    {{ city }}

    {{ adict }}

    {{ adict.name }}

    {{ adict.author }}

    {{ alist }}

    {{ alist.0 }}

    小知识点:在模板语言中字典数据类型的取值是通过dict.xxx而不是dict[xxx]

    六、 模型(Model)

                django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。

    1. 创建表

                   下面的模型定义了一个“图书类”,它具有 以下 字段,每一个字段都是一个类属性,每个类属性表示数据表中的一个列。

    # 必须继承models.Model
    class BookInfo(models.Model):
        """创建图书模型类"""
        # max_length:最大字段的长度,这里必须写
        btitle = models.CharField(max_length=20, verbose_name='书名')
        bpub_date = models.DateField(verbose_name='发布时间')
        bread = models.IntegerField(default=0, verbose_name='阅读量')
        bcomment = models.IntegerField(default=0, verbose_name='评论量')
        image = models.ImageField(upload_to='img', verbose_name='封面', null=True)
        is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    
        class Meta:
            """对模型类的设置"""
            # db_table:指关联的数据表,并自定义表名,但是需要在迁移前定义,不然无法生效
            db_table = 'tb_books'
            verbose_name = '图书'  # 在admin显示的名称
            verbose_name_plural = verbose_name  # 显示的复数名称
    
        def __str__(self):
            return self.btitle
    下面是原生sql创建表的语法:
    create table users_bookinfo (
        id int unsigned auto_increment primary key not null,
        btitle varchar(20) NOT NULL,
        ......
    );
    注意:
    • 表名users_bookinfo由Django自动生成,默认格式为“项目名称+下划线+小写类名”,你可以重写这个规则,使用db_table
    • Django默认自动创建自增主键id,当然,你也可以自己指定主键。
    • 上面的SQL语句基于MySQL语法。
    • 创建了模型之后,在使用它之前,你需要先在settings文件中的INSTALLED_APPS 处,注册models.py文件所在的users。看清楚了,是注册app,不是模型,也不是models.py
      Django流程及数据库等各项配置_第7张图片
    • 在迁移前需要创建好数据库
    • 当你每次对模型进行增、删、修改时,请务必执行命令python manage.py migrate,让操作实际应用到数据库上。这里可以选择在执行migrate之前,先执行python manage.py makemigrations让修改动作保存到记录文件中。

    2. 操作表

            a、基本操作

                     CURD

            b、进阶操作(了不起的双下划线

                        利用双下划线将字段和对应的操作连接起来  

     

    七、admin

            django amdin是django提供的一个后台管理页面,改管理页面提供完善的html和css,使得你在通过Model创建完数据库表之后,就可以对数据进行增删改查,而使用django admin 则需要以下步骤:

    • 创建后台管理员
    • 配置url
    • 注册和配置django admin后台管理页面

    注:不建议新手经常使用admin,会形成依赖,核心的是model模块的操作!

    1、创建后台管理员

    python manage.py createsuperuser

    2、配置后台管理url(默认已配)

    url(r'^admin/', admin.site.urls),

    3、注册和配置django admin 后台管理页面

    from django.contrib import admin
    from users.models import BookInfo, HeroInfo
    
    
    # Register your models here.
    
    admin.site.register(BookInfo)
    

            创建模型类--->创建数据库--->迁移--->导入数据(若导入数据错误,如果是字段类型写错,改完后要先迁移再重新导入数据)--->admin站点

    ==主页传送门==

    你可能感兴趣的:(Python,Django)