本文主要记录在大数点工作时,使用django搭建后台应用过程中所学到的新知识与心得。
一、前言
总结实际项目中使用django搭建后台服务学习到的内容
二、view
1、使用APIview 在配置文件的INSTALLED_APPS部分添加“rest_framework”, 然后就可以在视图函数中调用了
Copy # 状态码
from rest_framework import status
# response
from rest_framework.response import Response
# view类
from rest_framework.views import APIView
在写view视图的时候,就不用函数,而是视图类
Copy 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匹配中,可以这样
Copy url(r"^url_here", file_name.ClassName.as_view())
用as_view()
的方式来调用相应的视图类
在视图内部的话,可以使用
Copy # 获取query中的参数
request.data.get('params', '')
# 其他的参数,比如body中的都可以获取
request.query_params.get('params', '')
来获取参数,第二个参数是默认值
三、uwsgi-动态配置django服务
开始之前先提醒一下,虽然在本地测试运行都很顺利,但是如果以后在云服务上搭建,可能会出现各种各样 的问题,千万不要觉得自己简单地成功了一次,以后就会了,除了认真了解其中的原理这一种方法,其他的情况都只是运气好或不好的差别。
1、安装
2、测试
首先要有一个可以正常运行的django项目,在项目中新建一个uwsgi_test.py
的测试文件,
Copy def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
# return ['Hello world'] # Python2
return [b'Hello world'] # Python3
在项目中打开命令行
Copy # 注意修改下面的主机和端口
uwsgi --http host:port --wsgi-file uwsgi_test.py
打开浏览器,输入上面的主机和端口后,如果看到"Hello wold",就表示uwsgi正常
3、编写配置文件
Copy #添加配置选择
[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服务
Copy # 等价于 uwsgi uwsgi.ini
uwsgi --ini uwsgi.ini
uwsgi --stop uwsgi.pid
uwsgi --reload uwsgi.pid
当然这是开发时,部署要另外考虑。其中配置文件还不是很熟悉,
四、url
这部分没什么新奇的,大概只有一个就是使用了namespace
这个变量,如下
Copy url(r"", include("finance.urls", namespace="finance")),
当一个项目中有很多应用的时候,可以在项目下的url文件中,为需要的app添加命名空间,最初我学习的时候, 命令空间的作用是为了防止反解url名时错误,所以给不同类的url设置命令空间,但是这次我使用命名空间是为了 区分不同app中的url,这点与权限审核有关。比如我有几个应用,某些应用不需要任何权限,所有访问者都可以请求 ,但是有些应用比较特殊,需要高级权限才可以,当我使用中间件做权限审查的时候,又不想根据url一个个去区分的 时候,命名空间就可以把它们分开来。
五、中间件
这个资料有很多,其中第三个我没用过。
Copy 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添加相应的字典属性;还有
Copy request.path
request.resolver_match.namespace
request.META.get("HTTP_AUTHORIZATION")
等等属性,
六、项目里的其他文件
除了app以外,一般我们还会添加几个文件,比如
Copy # 工具类文件
apps_utils
# 常数文件
constants
其中常数文件与配置文件不同,只是放一些应用中常用的参数,一旦修改会涉及到很多地方,所以单独放在一个地 方。
七、日志
下面是项目中setting.py文件中配置日志参数,这部分的详细配置也不太清楚,如果想详细学习一下的话,可以 看上面的文档,我稍微看了一下,不是很难,直接用模板估计也没什么问题。
Copy # 日志配置
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()
中也可以添加自定义的字符串信息
Copy 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、时间语言配置
Copy LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True
最下面的USE_TZ
不是很懂,时区这部分也比较复杂。 2、rest_framework
Copy REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (),
'DEFAULT_AUTHENTICATION_CLASSES': ()
}
这个是自定义认证时关闭django默认的认证程序的设置 3、redis缓存配置 4、rabbitmq消息队列配置 这里并不涉及到celery,仅仅使用rabbitmq发送消息
九、manage.py
Copy setting_name = os.environ.get("SETTING_NAME") or "dev"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "department.settings." + setting_name)
十、rabbitmq配置
十一、redis缓存
十二、数据库连接池