python_new
  • Introduction
  • First Chapter
  • 一、python基础
    • 1.1 常识
      • sys
    • 1.2 基础语法(1)
    • 1.2 基础语法(2)
    • 1.3 常见问题求解
    • 1.4 算法
  • 二、爬虫
    • urllib库(1)
      • urllib库(2)
    • requests模块(1)
      • requests模块(2)
    • 2.1 爬虫基础(3)HTTP原理
    • 2.1 爬虫基础(4)会话和Cookies
    • 2.1 爬虫基础(5)数据存储
      • Mysql存储
      • MongoDB存储
      • Redis存储
    • 2.3 正则表达式
    • 2.4 解析库lxml
      • BeautifulSoup
      • pyquery(1)
      • pyquery(2)
    • 2.5 selenium(1)
    • 2.5 seleium(2)
    • 2.6 Json
    • 2.7 scrapy
      • scrapy(2)
    • 2.9 异步加载
    • 2.6 Splash
  • ORM框架
    • SQLAlchemy
  • Django
    • 1、初阶(一)
    • 初学:投票教程(一)
    • 初学:投票教程(二)
    • 初学:投票教程(三)
    • 初学:投票教程(总结)
    • 模型(一)
    • 模型(二)
    • 视图(一)
    • 视图(二)
    • 模板(一)
    • django实际使用笔记
  • 面试题收集总结
    • 数据结构原理
    • 算法篇
      • 排序
    • 题目篇
  • python数据分析
    • 基础了解(一)
    • 基础了解(二)
    • 基础了解(三)
  • 多线程
  • 深度学习
    • 疑问
  • keras(一)
  • 神经网络
  • 图像识别
  • Docker
    • 一、基础了解
Powered by GitBook
On this page
  • 一、前言
  • 二、view
  • 三、uwsgi-动态配置django服务
  • 四、url
  • 五、中间件
  • 六、项目里的其他文件
  • 七、日志
  • 八、配置文件中的其他配置
  • 九、manage.py
  • 十、rabbitmq配置
  • 十一、redis缓存
  • 十二、数据库连接池

Was this helpful?

  1. Django

django实际使用笔记

本文主要记录在大数点工作时,使用django搭建后台应用过程中所学到的新知识与心得。

一、前言

总结实际项目中使用django搭建后台服务学习到的内容

二、view

1、使用APIview 在配置文件的INSTALLED_APPS部分添加“rest_framework”, 然后就可以在视图函数中调用了

# 状态码
from rest_framework import status
# response
from rest_framework.response import Response
# view类
from rest_framework.views import APIView

在写view视图的时候,就不用函数,而是视图类

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

class ClassName(APIView):
    def get(self, request):
        pass
    def  put(self, request):
        pass
    # post, delete等

这样的写法有一个好处,就是当请求的方法不对时,可以自动报错,提示“请求方式不被允许”类似的信息。 对应的,在url匹配中,可以这样

    url(r"^url_here", file_name.ClassName.as_view())

用as_view()的方式来调用相应的视图类

在视图内部的话,可以使用

# 获取query中的参数
request.data.get('params', '')
# 其他的参数,比如body中的都可以获取
request.query_params.get('params', '')

来获取参数,第二个参数是默认值

三、uwsgi-动态配置django服务

开始之前先提醒一下,虽然在本地测试运行都很顺利,但是如果以后在云服务上搭建,可能会出现各种各样 的问题,千万不要觉得自己简单地成功了一次,以后就会了,除了认真了解其中的原理这一种方法,其他的情况都只是运气好或不好的差别。

1、安装

pip install uwsgi

2、测试

首先要有一个可以正常运行的django项目,在项目中新建一个uwsgi_test.py的测试文件,

def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    # return ['Hello world'] # Python2
    return [b'Hello world']  # Python3

在项目中打开命令行

# 注意修改下面的主机和端口
uwsgi --http host:port --wsgi-file uwsgi_test.py

打开浏览器,输入上面的主机和端口后,如果看到"Hello wold",就表示uwsgi正常

3、编写配置文件

#添加配置选择
[uwsgi]
#配置和nginx连接的socket连接
# socket=127.0.0.1:8002
# 将uwsgi作为独立的web_server
http=192.168.2.181:8000
#配置项目路径,项目的所在目录
chdir= 
#配置wsgi接口模块文件路径,可以是相对与项目的路径
wsgi-file=department/wsgi.py
#配置启动的进程数
processes=4
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=uwsgi.pid
#配置dump日志记录
daemonize=uwsgi.log`

可以通过命令行控制uwsgi服务

# 等价于 uwsgi uwsgi.ini
uwsgi  --ini  uwsgi.ini

uwsgi --stop uwsgi.pid
uwsgi --reload uwsgi.pid

当然这是开发时,部署要另外考虑。其中配置文件还不是很熟悉,

四、url

这部分没什么新奇的,大概只有一个就是使用了namespace这个变量,如下

url(r"", include("finance.urls", namespace="finance")),

当一个项目中有很多应用的时候,可以在项目下的url文件中,为需要的app添加命名空间,最初我学习的时候, 命令空间的作用是为了防止反解url名时错误,所以给不同类的url设置命令空间,但是这次我使用命名空间是为了 区分不同app中的url,这点与权限审核有关。比如我有几个应用,某些应用不需要任何权限,所有访问者都可以请求 ,但是有些应用比较特殊,需要高级权限才可以,当我使用中间件做权限审查的时候,又不想根据url一个个去区分的 时候,命名空间就可以把它们分开来。

五、中间件

这个资料有很多,其中第三个我没用过。

class Middle_Test(object): 
    # 在请求之前,还没有进行url分配
    def process_request(self,request): 
        pass 
    # 在请求之后,进入视图之前,已经进行了url分配
    def process_view(self, request, callback, callback_args, callback_kwargs): 
        i =1 
        pass 
    def process_exception(self, request, exception): 
        pass 
    # 在返回数据之前
    def process_response(self, request, response): 
        return response

使用的时候,可以单独在项目地下创建一个middleware.py文件,其中写自定义的 中间件类。最近我学到很多活用request的方法,比如缓存放在request中,在process_request方法中 为所有的request添加相应的字典属性;还有

request.path
request.resolver_match.namespace
request.META.get("HTTP_AUTHORIZATION")

等等属性,

六、项目里的其他文件

除了app以外,一般我们还会添加几个文件,比如

# 工具类文件
apps_utils
# 常数文件
constants

其中常数文件与配置文件不同,只是放一些应用中常用的参数,一旦修改会涉及到很多地方,所以单独放在一个地 方。

七、日志

下面是项目中setting.py文件中配置日志参数,这部分的详细配置也不太清楚,如果想详细学习一下的话,可以 看上面的文档,我稍微看了一下,不是很难,直接用模板估计也没什么问题。

# 日志配置
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        # 打印到控制台的方式 
        'console': {
            'level': 'ERROR',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        # 配置日志文件
        'file': {
            # 消息的严重等级
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/background.log"),
            'maxBytes': 300 * 1024 * 1024,
            'backupCount': 10,
            'formatter': 'verbose'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            'propagate': True,
            'level': 'ERROR',
        },
    }
}

在视图中使用,这个logger.error()中也可以添加自定义的字符串信息

import logging
# 在settings中日志部分配置的‘django’
logger = logging.getLogger('django')

class ClassName(APIView):
    def get(self, request):
        try:
            "code here"
        except Exception as e:
            logger.error(e)
        return Response()

八、配置文件中的其他配置

实际中setting并不是一个文件,而是一个模块,其中有三个文件,分别是prod, dev, tenv,对应正式, 开发和测试的环境。setting中的配置有很多,默认的和自定义都放在这里。我看了官方文档讲的也不多,上面的 算是比较详细的了。

1、默认的django配置

1、时间语言配置

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

USE_TZ = True

最下面的USE_TZ不是很懂,时区这部分也比较复杂。 2、rest_framework

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (),
    'DEFAULT_AUTHENTICATION_CLASSES': ()
}

这个是自定义认证时关闭django默认的认证程序的设置 3、redis缓存配置 4、rabbitmq消息队列配置 这里并不涉及到celery,仅仅使用rabbitmq发送消息

九、manage.py

setting_name = os.environ.get("SETTING_NAME") or "dev"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "department.settings." + setting_name)

十、rabbitmq配置

十一、redis缓存

十二、数据库连接池

Previous模板(一)Next面试题收集总结

Last updated 6 years ago

Was this helpful?

参考: 官方文档: 其他资料: 线程和进程的部分:

官方文档:

参考文档: 官方文档:

https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/WSGIquickstart.html
https://www.cnblogs.com/qingspace/p/6838747.html、https://www.jianshu.com/p/0e85cf58e677
https://blog.csdn.net/hehekk/article/details/85237375
https://docs.djangoproject.com/en/2.2/topics/logging/
https://blog.csdn.net/Odyssues_lee/article/details/80834438
https://docs.djangoproject.com/en/1.11/ref/settings/