《二》django之url、视图、日志功能logging

django之url

参考文档:https://yiyibooks.cn/xx/Django_1.11.6/topics/http/urls.html

在setting中ROOT_URLCONF = 'devops.urls' 配置

Django如何处理请求
《二》django之url、视图、日志功能logging

匹配url,都是从第一个往下匹配,若第一个可以匹配,就不用跳到第二个url规则

from django.conf.urls import url,include
from . import views

app_name = 'dashboard'
urlpatterns = [
    url(r'^$', views.index,name='index'),
    url(r'^login/$', views.loginView,name='login'),
        url(r'^login/', views.loginView1,name='login1'),
]

每个正则表达式前面的'r' 是可选的但是建议加上。 它告诉Python 这个字符串是“原始的” ,表示:字符串中任何字符都不应该转义。

url映射一般是一条正则表达式,“^” 字符串的开始,“$“ 字符串的结束

例子1:访问“http://127.0.0.1:8000/dashboard/login/123” 匹配的是 url(r'^login/', views.loginView1,name='login1') 这条

         访问:“http://127.0.0.1:8000/dashboard/login”  匹配的是   url(r'^login/$', views.loginView,name='login') 这条

                    “http://127.0.0.1:8000/dashboard/login/?page=1&&po=2”  这种带参数的 url(r'^login/', views.loginView1,name='login1') 和url(r'^login/$', views.loginView,name='login')  都可以匹配

例子2:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

匹配第一个:
访问:“http://127.0.0.1:8000/dashboard/articles/2003/

匹配第二个:
访问:“http://127.0.0.1:8000/dashboard/articles/2013/

匹配第三个:
访问:“http://127.0.0.1:8000/dashboard/articles/2013/12/

匹配第四个:
访问:“http://127.0.0.1:8000/dashboard/articles/2014/12/12312123123213/

def article_detail(request,*args,**kwargs):
    print("args:",args)
    print("kwargs:",kwargs)
    return HttpResponse('12')

结果:
args: ('2014', '12', '12312123123213')
kwargs: {}

关键字参数

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),

def article_detail(request,*args,**kwargs):
    return HttpResponse(json.dumps(kwargs))

结果:
《二》django之url、视图、日志功能logging

《二》django之url、视图、日志功能logging

include访问:

 urlpatterns = [
      url(r"^user/", include([
          url(r'^list/$', view.userlist, name="user_list"),
          url(r'^info/$', view.userinfo, name="userer_inf),
          url(r'^modify/', include([
             url(r'status/$',view.modifystatus, name="user_modify_status"),
          ]))
      ]))
]
访问:‘http://127.0.0.1:8000/user/list/’
                    ‘http://127.0.0.1:8000/user/info/’
                    ‘http://127.0.0.1:8000/user/modify/’
                                ‘http://127.0.0.1:8000/user/modify/status/’

类视图

以函数的形式进行定义的视图就是函数视图
以类的的形式进行定义的视图就是类视图

例子:展示页面的增删改查功能

用函数视图实现:
《二》django之url、视图、日志功能logging

结果:
《二》django之url、视图、日志功能logging

用类视图实现:
.as_view() 为类视图提供一个函数入口

url(r'^login/$', views.LoginUser.as_view(),name='login'),

from django.views import View
《二》django之url、视图、日志功能logging

http_method_names 没有list方法,需要添加:
《二》django之url、视图、日志功能logging

验证:
《二》django之url、视图、日志功能logging

分页练习:
1、from django.core.paginator import Paginator
2、

class UserViewV4(View):
    def get(self,request,*args,**kwargs):
        queryset = User.objects.all()
        paginator = Paginator(queryset,20)  #20条数据为一页,实例化分页对象
        try:
            page = int(request.GET.get('page'))
        except:
            page = 1
        if page < 1:
            page = 1
        page = paginator.page(page)   #取对象的第几分页对象;page.object_list:为第几分页的内容
        data = [{'id':user.id,'email':user.email,'username':user.username} for user in page.object_list]
        return JsonResponse(data,safe=False)

例子2:
通过给定的接口创建普通用户密码

class UserViewV5(View):
    def post(self,request,*args,**kwargs):
        data = request.POST.dict()#接收所有的dict
        print(data) 
        try:
            user = User.objects.create_user(**data)
        except IntegrityError:
            return JsonResponse({'error':'用户已存在'})
        return JsonResponse({'id':user.id,'email':user.email,'username':user.username})

《二》django之url、视图、日志功能logging

create_user接收的参数,data那里必须要对应起来,不然添加不了,:
《二》django之url、视图、日志功能logging

日志功能logging

Django 使用Python 内建的logging 模块打印日志,Python 的logging 配置由四个部分组成:

记录器 —— Logger
    用户使用的直接接口,将日志传递给Handler

处理程序 —— Handler
    控制日志输出到哪里,console,file… 

过滤器 —— Filter
    控制哪些日志可以从logger流向Handler,基本不用

格式化 —— Formatter
    控制日志的格式

每个logger 都有一个日志级别。日志级别表示该logger 将要处理的消息的严重性。Python 定义以下几种日志级别:
DEBUG:用于调试目的的底层系统信息
INFO:普通的系统信息
WARNING:表示出现一个较小的问题。
ERROR:表示出现一个较大的问题。
CRITICAL:表示出现一个致命的问题。

logger的定义
写入logger 的每条消息都是一条日志。每条日志也具有一个日志级别,它表示对应的消息的严重性。每个日志记录还可以包含描述正在打印的事件的元信息。
当一条消息传递给logger 时,消息的日志级别将与logger 的日志级别进行比较。如果消息的日志级别大于等于logger 的日志级别,该消息将会往下继续处理。如果小于,该消息将被忽略。
Logger 一旦决定消息需要处理,它将传递该消息给一个Handler。

logger的日志级别:
《二》django之url、视图、日志功能logging

logger 对应的值是个字典,其每一个键都是logger的名字,每一个值又是个字典,描述了如何配置对应的Logger实例。
level (可选的)。logger的级别。
propagate (可选的)。logger的传播设置。
filters (可选的)。logger的filter的标识符的列表。
handlers (可选的)。logger的handler的标识符的列表。

Logger配置示例
'loggers': {
        'reboot': {
            'handlers': ["file"],
            'level': 'DEBUG',
            'propagate': True
        },
        "django": {
            'handlers': ["django"],
            'level': 'DEBUG',
            'propagate': True
        },
        "django.server": {
            'handlers': ["django_server"],
            'level': 'DEBUG',
            "propagate": True
        }
    }

处理程序 —— Handler
Handler 决定如何处理logger 中的每条消息。它表示一个特定的日志行为,例如将消息写到屏幕上、写到文件中或者写到网络socket
与logger 一样,handler 也有一个日志级别。如果消息的日志级别小于handler 的级别,handler 将忽略该消息
Logger 可以有多个handler,而每个handler 可以有不同的日志级别。利用这种方式,可以根据消息的重要性提供不同形式的处理

'handlers': {
        'reboot': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple',
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/django.log',
            'formatter': 'simple',
        },
        'django': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/default.log',
            'formatter': 'json',
        },
        'django_server': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/django_server.log',
            'formatter': 'simple',
        },
    }

一、StreamHandler
流handler——包含在logging模块中的三个handler之一。

能够将日志信息输出到sys.stdout, sys.stderr 或者类文件对象

二、FileHandler
logging模块自带的三个handler之一。继承自StreamHandler。将日志信息输出到磁盘文件上。

格式化——Formatters

《二》django之url、视图、日志功能logging

'formatters': {
        'json': {
            'format': '{"levelname":"%(levelname)s","asctime":"%(asctime)s","module":"%(name)s","fullpath":"%(pathname)s","funcName":"%(funcName)s","lineno":"%(lineno)s","message":"%(message)s"}'
        },
        'reboot': {
            'format': '%(asctime)s - %(pathname)s:%(lineno)d[%(levelname)s] - %(message)s'
        },
        'simple': {
            'format': '%(name)s %(asctime)s %(levelname)s %(message)s'
        }

Django内建logging
root

  • django 获取所有日志
  • django.request 处理与请求相关的日志,5xx响应报出error日志,4xx报出WARNING日志
  • django.db.backends 处理与数据库之间交互的日志,
  • django.server: 处理请求相关的消息。只用于开发阶段。
  • django.security.* 处理与安全相关的日志
  • django.db.backends.schemea 处理数据库迁移时的日志

练习使用logging
settings.py中写入

LOGGING = {
    'version': 1,#保留版本
    'disable_existing_loggers': False,# 禁用已经存在的logger实例
    'loggers': {
        'reboot': {
            'handlers': ["file"],#对应下面定义的hanglers
            'level': 'DEBUG',
            'propagate': True#开启后向上传播
        },
        "django": {
            'handlers': ["django"],
            'level': 'DEBUG',
            'propagate': True
        },
        "django.server": {
            'handlers': ["django_server"],
            'level': 'DEBUG',
            "propagate": True
        }
    },
    'handlers': {
        'reboot': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',#只输出到终端展示,不写入到文件,可以用于开发环境
            'formatter': 'simple',#对应下面的定义
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',#写入文件,可以用于生产环境
            'filename': '/tmp/django.log',
            'formatter': 'simple',
        },
        'django': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/default.log',
            'formatter': 'json',
        },
        'django_server': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/django_server.log',
            'formatter': 'simple',
        },
    },
    'formatters': {
        'json': {
            'format': '{"levelname":"%(levelname)s","asctime":"%(asctime)s","module":"%(name)s","fullpath":"%(pathname)s","funcName":"%(funcName)s","lineno":"%(lineno)s","message":"%(message)s"}'
        },
        'reboot': {
            'format': '%(asctime)s - %(pathname)s:%(lineno)d[%(levelname)s] - %(message)s'
        },
        'simple': {
            'format': '%(name)s %(asctime)s %(levelname)s %(message)s'
        },
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
    },
    "root": { #使用root表示什么日志都记录,也可以写
        'handlers': ["file"],#记录到文件
        'level': 'DEBUG',#级别为debug
    }
}

views.py中:

import logging
#生成一个以当前文件名为名字的logger实例
logger = logging.getLogger(name)

class UserViewV5(View):
    def post(self,request,*args,**kwargs):
        logging.debug('创建用户')
        data = request.POST.dict()#接收所有的dict
        try:
            logger.debug("执行用户创建")
            user = User.objects.create_user(**data)
        except IntegrityError:
            logger.error("用户已存在")
            return JsonResponse({"errmsg": "该用户已存在"})
        return JsonResponse({'id':user.id,'email':user.email,'username':user.username})

验证:

In [28]: import requests                                                                                                             

In [29]: data                                                                                                                        
Out[29]: {'username': 'op', 'password': '123', 'email': 'op@admin.com'}

In [30]: r = requests.post('http://127.0.0.1:8000/dashboard/user/',data).json()                                                      

In [31]: r                                                                                                                           
Out[31]: {'errmsg': '该用户已存在'}
[root@localhost tmp]# ll
total 16
-rw-rw-r-- 1 vagrant vagrant 4202 Nov  1 11:58 default.log
-rw-rw-r-- 1 vagrant vagrant 2466 Nov  1 11:58 django.log
-rw-rw-r-- 1 vagrant vagrant  166 Nov  1 11:58 django_server.log

开发环境key输出到终端,可以这样写:
新增settings_dev.py
《二》django之url、视图、日志功能logging

from .settings import *
LOGGING = {
    'version': 1,#保留版本
    'disable_existing_loggers': False,# 禁用已经存在的logger实例
    'loggers': {
        'reboot': {
            'handlers': ["reboot"],#对应下面定义的hanglers
            'level': 'DEBUG',
            'propagate': False#开启后向上传播
        },
        "django": {
            'handlers': ["reboot"],
            'level': 'DEBUG',
            'propagate': False
        }
    },
    'handlers': {
        'reboot': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',#只输出到终端展示,不写入到文件,可以用于开发环境
            'formatter': 'simple',#对应下面的定义
        },
    },
    'formatters': {
        'simple': {
            'format': '%(name)s %(asctime)s %(levelname)s %(message)s'
        },
    },
    "root": {
        'handlers': ["reboot"],
        'level': 'DEBUG',
    }
}

只更改如下地方:
《二》django之url、视图、日志功能logging

运行:
《二》django之url、视图、日志功能logging

这样可以实现将开发和生产环境分开

转载于:https://blog.51cto.com/jacksoner/2307465

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值