字节流的博客

Django 使用笔记

  1. 项目名称不用用连字符 -,名称必须是有效的包名。如果在 PyCharm 中新建 Django 项目时,项目名称中包含连字符,则无法创建项目,并提示:Project name should only contain letters, number and underscores

  2. 运行使用 Django 自带的测试模块 django.test 的测试用例时,默认需要一个与开发不同的数据库。可以在 settings.pyDATABASE 中添加:

    1
    2
    3
    'TEST': {
    'NAME': 'your-db-name',
    }

    来指定测试使用的数据库。测试用例执行完成后会直接 drop 掉数据库。可以在运行时使用 --keepdb 参数保证测试用的数据库不会被 drop,但是在表中所有产生的数据,是不会保存的。详情可参考:Writing and running tests

  3. 如果不习惯用测试用例,只是想简单的测试下产生的效果,或者构造一些数据,可以在项目根目录下新建 scripts 文件夹,在 scripts 文件夹下新建 Python 脚本,并把要执行的代码放到 run 方法下即可。示例如下:

    test.py

    1
    2
    3
    4
    def run():
    # do something
    for i in range(0, 10):
    print(i)

    然后执行 python manage.py runscript test 即可。

  4. 在模板中,除了可以用一些内置的 template tags 和 filters(如 autoespaceblockcommentcsrf_token 等常用的 template tags,default_if_noneadddate 等常用 filters ),还可以自定义 template tag 和 filter 用于实现特定的功能。

    自定义 template tag 和 filter 也很方便,在 app 目录下,新建 templatetags 包,在此文件夹下新建相应脚本即可。示例如下:

    utils.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    from django import template

    register = template.Library()

    # 自定义 tag
    @register.simple_tag(name='math_add')
    def math_add(x, y):
    return x + y

    # 自定义 filter
    @register.filter(name='parse_gender')
    def parse_gender(flag):
    if not flag:
    return '未知'
    if flag == 1:
    return '男'
    else:
    return '女'

    在模板文件中先 load 然后使用即可:

    1
    2
    3
    4
    5
    6
    7
    8
    <!-- 加载 utils -->
    {% load utils %}

    <!-- 使用自定义 tag math_add -->
    <input id="sum" type="text" value="{% math_add 3 5 %}">

    <!-- 使用自定义 filter parse_gender -->
    <span>{{ 2|parse_gender }}</span>

    详情可参考自定义 template tags 和 filters

  5. 相对于 Java Servelet 中可以对 request 进行 preprocessing 和 postprocessing 的 Filter,Django 中的 Middleware 也是干这个的。🤓

    Middleware is a framework of hooks into Django’s request/response processing. It’s a light, low-level “plugin” system for globally altering Django’s input or output.

    使用 middleware 也非常简单。在 App 目录下新建 middleware 包,然后创建相应中间件脚本,示例如下:

    perm_filter.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import redirect

    # 简单示例:
    # 如果请求路径是以 /api 开头,则重定向到登录页面
    # 否则,直接放行,进行下一步处理
    class PermissionFilterMiddleware(MiddlewareMixin):
    def process_request(self, request):
    path = request.path_info
    if path.startswith('/api'):
    return redirect('/login')
    else:
    return

    然后在 settings.py 中配置上 MIDDLEWARE 即可:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django_demo.middleware.filter.PermissionFilterMiddleware' # 自定义 middleware
    ]
  6. 在上线部署前,一定要在 ALLOWED_HOSTS 配置项中添加上线上环境所监听的 IP 和域名,否则无法提供服务。详情可参考 Settings

Thanks! 😊