Django 使用笔记

193 阅读2分钟
原文链接: blog.smoker.cc
  1. 项目名称不用用连字符 -,名称必须是有效的包名。如果在 PyCharm 中新建 Django 项目时,项目名称中包含连字符,则无法创建项目,并提示:Project name should only contain letters, number and underscores

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

    
                                                                        
    'TEST': {
        'NAME': 'your-db-name',
    }
    
    
                                                                    

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

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

    test.py

    
                                                                        
    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

    
                                                                        
    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 然后使用即可:

    
                                                                        
    <!-- 加载 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

    
                                                                        
    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 即可:

    
                                                                        
    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