大纲


    首页 django笔记 详情
    创建django项目

    创建django项目

    创建项目的虚拟环境

    使用anaconda创建django项目的虚拟环境

    # 1. 打开anaconda prompt
    conda create -n env_django python=3.9
    
    # 2. 激活虚拟环境,默认在anaconda下的envs中
    conda activate env_django
    
    # 3. 安装django
    conda install django==4.2
    
    # 4. 测试环境是否安装好
    import django
    django.get_version()
    
    # 5. 切换到项目目录,创建django工程
    django-admin startproject HelloDjango
    

    新建的django工程目录结构及主要作用如下:

    └── HelloDjango
        ├── HelloDjango         # django-admin startproject HelloDjango 工程目录,工程的主配置
        │   ├── __init__.py     # 告诉python该目录是一个python包,暂无内容,后期一些工具的初始化可能会用
        │   ├── settings.py     # Django项目的配置文件,默认状态其中定义了本项目引用的组件,项目名,数据库,静态资源等
        │   ├── urls.py         # 维护项目的URL路由映射,即定义当客户端访问时由哪个模块进行响应
        │   └── wsgi.py         # 定义WSGI的接口信息,主要用于服务器集成,通常本文件生成后无需改动
        ├── manage.py           # 用于管理本项目的命令行工具,之后进行站点运行,数据库自动生成等都是通过本文件完成
        └── templates           # 手动创建的模板目录,可在pycharm中右键设置为模板目录
    

    可以使用pycharm打开项目,需要注意需要在工程的顶层目录打开,作为根目录存在

    初次初始化项目

    迁移数据库

    django默认使用的数据库是sqlite3,后续有需求也可以将其更改为Mysql、postgres等

    # 生成迁移文件
    python manage.py makemigrations
    # 执行迁移
    python manage.py migrate
    

    创建超级管理员

    创建超级管理员,输入用户名、邮箱、密码

    python manage.py createsuperuser
    

    运行项目

    运行项目,可以指定端口,默认为8000,也可以从指定配置文件启动项目 然后在浏览器输入 localhost:8000 访问,成功则表示环境、项目创建一切ok

    python manage.py runserver [ip:port]  [--settings=mysite.settings]
    

    django提供了一个纯python编写的轻量级web服务器,仅在开发阶段使用 django默认工作在调式Debug模式下,如果增加、修改、删除文件,服务器会自动重启 按ctrl+c停止服务器

    也可以直接在manage.py中更改端口号

    #!/usr/bin/env python
    """Django's command-line utility for administrative tasks."""
    import os
    import sys
    
    
    def main():
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'superdatafarmer.settings')
        try:
            from django.core.management import execute_from_command_line
        except ImportError as exc:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            ) from exc
        execute_from_command_line(sys.argv)
    
    
    if __name__ == '__main__':
        # 重新指定项目运行的端口
        from django.core.management.commands.runserver import Command as runserver
        runserver.default_port = '8080'
        main()
    

    更改配置文件

    在正式编写我们django程序之前,我们需要先做一些配置,在settings.py中更改如下配置:

    更改debug模式

    调试模式,创建工程后初始值为True

    • 即默认工作在调试模式下,Django程序出现异常时,向前端显示详细的错误追踪信息
    • 增加、修改、删除文件,服务器会自动重启
    DEBUG=true
    

    注意:部署线上运行的Django不要运行在调式模式下,记得修改DEBUG=False

    更改数据库

    一般情况下会使用mysql数据库,一般需要安装mysql-client作为mysql的驱动包

    pip install mysqlclient
    

    但是mysql-client有时候安装会报错,我们可以选择pymysql

    pip install pymysql
    

    安装pymysql后需要在,项目同名子目录下的__init__.py中添加如下命令:

    import pymysql
    
    pymysql.install_as_MySQLdb()
    

    在setting.py配置mysql参数如下:

    DATABASES = {
        'default': {
            # 'ENGINE': 'django.db.backends.sqlite3',
            # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            'ENGINE':'django.db.backends.mysql',
            'NAME':'blog',
            'USER':'root',
            'PASSWORD':'123456',
            'HOST':'localhost',
            'PORT':'3306',
            'OPTIONS': {
                "init_command": "SET foreign_key_checks = 0;",
                'charset': 'utf8mb4', 
                'use_unicode': True,
            },
        }
    }
    
    # 需要更改如下参数,否则会报错
    # Database returned an invalid datetime value. Are time zone definitions for your database installed?
    USE_TZ = False  
    

    更改本地时区

    # LANGUAGE_CODE = 'en-us'  # 语言
    # TIME_ZONE = 'UTC'  # 时区
    LANGUAGE_CODE = 'zh-hans'
    TIME_ZONE = 'Asia/Shanghai'
    

    日志配置

    # 日志文件
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'file': {
                'level': 'DEBUG',
                'class': 'logging.FileHandler',
                'filename': '/home/mysite_debug.log',
            },
            'mail_admins': {
                'level': 'ERROR',
                'class': 'django.utils.log.AdminEmailHandler',
            }
        },
        'loggers': {
            'django': {
                'handlers': ['file'],
                'level': 'DEBUG',
                'propagate': True,
            },
            'django.request': {
                'handlers': ['mail_admins'],
                'level': 'ERROR',
                'propagate': False,
            },
        },
    }
    

    创建应用app

    创建子应用

    python manage.py startapp Appname
    

    创建后,会在django目录下生成一个子文件夹,我们一般还需要再添加一个urls.py文件,添加后目录如下:

    └── HelloDjango
        ├── App                  # Django manage.py startapp App 创建的web应用,应用目录
        │   ├── admin.py                 # 对应应用后台管理配置文件,默认为空
        │   ├── apps.py                  # 应用信息定义文件,在其中生成了AppConfig,该类用于定义应用名等数据
        │   ├── __init__.py
        │   ├── migrations       # 数据迁移、移植文目录,记录数据库操作记录,内容自动生成
        │   │   ├── __init__.py
        │   │   └── __pycache__
        │   │       └── __init__.cpython-37.pyc
        │   ├── models.py           # 添加模型层数据类文件
        │   ├── tests.py                # 测试代码文件
        │   └── views.py              # 定义URL相应函数(路由规则)
        ├── HelloDjango             # django-admin startproject HelloDjango 工程目录,工程的主配置
        │   ├── __init__.py         # 告诉python该目录是一个python包,暂无内容,后期一些工具的初始化可能会用
        │   ├── settings.py     # Django项目的配置文件,默认状态其中定义了本项目引用的组件,项目名,数据库,静态资源等
        │   ├── urls.py                 # 维护项目的URL路由映射,即定义当客户端访问时由哪个模块进行响应
        │   └── wsgi.py                 # 定义WSGI的接口信息,主要用于服务器集成,通常本文件生成后无需改动
        ├── manage.py           # 用于管理本项目的命令行工具,之后进行站点运行,数据库自动生成等都是通过本文件完成
        └── templates           # 手动创建的模板目录,可在pycharm中右键设置为模板目录
    

    注册应用

    创建应用后,需要注册,在settings.py文件中添加如下内容:

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'App',  # 添加新注册的应用
    ]
    

    编写一个简单页面的步骤

    创建模型

    在应用的models.py目录下创建模型

    from django.db import models
    
    class Grade(models.Model):
        gname = models.CharField(max_length=10)
        gdate = models.DateTimeField()
        ggirlnum = models.IntegerField()
        gboynum = models.IntegerField()
        isDelete = models.BooleanField()
    
        class Meta:
            verbose_name = '专题'
            verbose_name_plural = verbose_name
            ordering = ['id']
    
        def __str__(self):
            return self.gname
    

    创建模型后,执行迁移命令,会在数据库中生成对应的表

    在admin.py中注册模型

    可以在django的内置后台(localhost:8000/admin/)中生成这个model的管理表单

    from django.contrib import admin
    from .models import Grade
    
    @admin.register(Grade)
    class GradeAdmin(admin.ModelAdmin):
        list_display = ('id','gname','gdate')
        ordering = ('-id',)
    
    # 或者
    admin.site.register(ArticlePost)
    

    在views.py中定义视图

    视图即需要编写的业务逻辑

    • 第一个传入参数必须定义,用于接收Django构造的包含了请求数据的HttpReqeust对象,通常名为request
    • 返回值必须为一个响应对象,可以将要返回的字符串数据放到一个HTTPResponse对象中或者渲染一个模板返回
    from django.http import HttpResponse
    
    def welcome(request):
        """
        :param request: 包含了请求信息的请求对象
        :return: 响应对象
        """
        return HttpResponse('HelloDjango')
    

    定义路由

    在创建app的时候,默认目录下是没有路由文件的,我们需要在app的目录下手动新建一个 urls.py 文件用于存放路由

    Django2.0之后,app的urls.py必须配置app_name,否则会报错

    from django.urls import path
    from . import views
    
    app_name = 'app'
    urlpatterns = [
        path('welcome/', views.welcome, name='welcome'),
    ]
    

    然后在项目的总路由(在项目同名子目录下的urls.py中)中关联这个路由

    namespace可以保证反查到唯一的url,即使不同的app使用了相同的url

    from django.contrib import admin
    from django.urls import path,include
    
    urlpatterns = [
        path("admin/",admin.site.urls),
        path("app/", include("app.urls",namespace="app")),
    ]
    

    然后我们运行项目,在浏览器中输入:localhost:8000/welcome/ , 就可以看到我们返回的内容了

    使用模板

    我们需要在应用目录下新建模板文件夹,然后添加一个html文件,目录结构如下:

    └── HelloDjango
        ├── App
        │   ├── admin.py
        │   ├── apps.py
        │   ├── __init__.py
        │   ├── migrations
        |       |—— templates  # 名称必须是templates
        |       |       |——app  # 和app名称相同,用于存放模板文件
        |       |           |—— welcome.html
        │   ├── models.py
        │   ├── tests.py
        │   └── views.py
    

    html文件内容如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>welcome</h1>
        <p>你好</p>
    </body>
    </html>
    

    在setting.py做如下配置:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [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',
                ],
            },
        },
    ]
    

    视图函数改为如下:

    from django.shortcuts import render
    
    def welcome(request):
        """
        :param request: 包含了请求信息的请求对象
        :return: 响应对象
        """
        return render(request,'app/welcome.html')
    

    运行项目后就可以看到刚才定义的html中的内容

    其他的一些设置

    设置静态文件的路径

    # settings.py中
    STATIC_URL = '/static/'
    STATICFILES_DIRS = [
        BASE_DIR /'static'
    ]
    
    # 部署后需要收集所有的静态文件,需要添加如下参数
    STATIC_ROOT = BASE_DIR /'static_collectd'
    # 使用如下命令触发收集:django manage.py collectstatic
    

    设置媒体文件路径

    # settings.py
    # 媒体文件上传路径
    MEDIA_URL = '/media/'
    MEDIA_ROOT = BASE_DIR / 'media'
    
    # 在项目根路由中配置media的路由 urls.py
    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
    

    设置缓存,如数据库缓存

    # settings.py
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'my_cache_table',
        }
    }
    # 创建缓存表的命令  python manage.py createcachetable
    

    邮件服务器设置

    EMAIL_HOST = 'smtp.163.com'  # SMTP服务器
    EMAIL_HOST_USER = 'xxxx@163.com'  # 邮箱名
    EMAIL_HOST_PASSWORD = 'xxxxxxx'  # 邮箱密码
    EMAIL_PORT = 25  # 发送邮件的端口
    EMAIL_USE_TLS = True  # 是否使用 TLS
    DEFAULT_FROM_EMAIL = 'xxxx@163.com'  # 默认的发件人
    

    常用命令集合

    # 查看所有命令
    python manage.py
    
    # 新建项目
    django-admin.py startproject mysite
    # 新建APP
    python manage.py startapp blog
    
    # 启动
    python manage.py runserver 8080
    
    # 同步或者更改生成 数据库:
    python manage.py makemigrations [app]
    python manage.py migrate
    # 查看迁移文件的具体sql语句
    python manage.py sqlmigrate appname 迁移文件名
    
    # 创建管理员
    python manage.py createsuperuser
    
    # 创建缓存表
    python manage.py createcachetable
    
    # 清空数据库
    python manage.py flush
    
    # 修改用户密码
    python manage.py changepassword username
    
    # Django项目环境终端,调用当前项目的 models.py 中的 API,对于操作数据的测试非常方便
    python manage.py shell
    

    配置文件拆分

    评论
    您尚未登录,请 登录 后评论
    共 0 条评论 | 欢迎尬评