• 自动化监控系统(三) 搭建xadmin做网站后台


    Django有个自带的admin后台,不过界面不怎么好看,这里我用xadmin

    我的python版本是3.5,可以使用支持py3的xadmin:https://github.com/sshwsfc/xadmin

    xadmin部署步骤:

    1、把xadmin整个目录拷贝到项目里面

    2、需要安装的依赖包:

    django~=1.9.0
    django-crispy-forms~=1.6.0
    django-reversion~=2.0.0
    django-formtools==1.0
    future==0.15.2
    httplib2==0.9.2
    six==1.10.0

    3、注册xadmin:

    把xadmin,crispy_forms,reversion注册到install_apps里面,然后再添加xadmin的url配置就可以了。

    import xadmin
    
    urlpatterns = [
        url(r'^xadmin/', xadmin.site.urls),
    ]

    4、使用django的命令行工具生成xadmin数据表,然后创建管理后台的超级用户:

    分别执行makemigrations和migrate

     创建管理后台的超级用户

     

    接着输入email和passwd就可以登陆了。

    英文界面不怎么友好,改成中文(我英语不好)

     在settings里修改配置:

    #LANGUAGE_CODE = 'en-us'
    LANGUAGE_CODE = 'zh-hans'
    
    # TIME_ZONE = 'UTC'
    TIME_ZONE = 'Asia/shanghai'
    
    USE_I18N = True
    
    USE_L10N = True
    
    #这里是指定默认时间,如果为True,则写进数据库的时间是utc时间,需要改成False
    USE_TZ = False

     很明显,我在monitor app的model里创建的表在这里没显示,因为xadmin的使用,首先需要对model进行注册,才能在后台管理中进行操作。

    1、在app里创建py文件:adminx(必须这个名称)

    2、导入xadmin和models里的类,格式如下:

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    __author__ = "BIGNI"
    __date__ = "2017/4/9 21:08"
    
    import xadmin
    
    from django import forms
    from xadmin import views
    from  monitor import models
    # Register your models here.
    
    # from django.contrib.auth.admin import UserAdmin
    from django.contrib.auth.forms import ReadOnlyPasswordHashField
    
    class UserCreationForm(forms.ModelForm):
        """A form for creating new users. Includes all the required
        fields, plus a repeated password."""
        password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
        password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
    
        class Meta:
            model = models.UserProfile
            fields = ('email','name')
    
        def clean_password2(self):
            # Check that the two password entries match
            password1 = self.cleaned_data.get("password1")
            password2 = self.cleaned_data.get("password2")
            if password1 and password2 and password1 != password2:
                raise forms.ValidationError("Passwords don't match")
            return password2
    
        def save(self, commit=True):
            # Save the provided password in hashed format
            user = super(UserCreationForm, self).save(commit=False)
            user.set_password(self.cleaned_data["password1"])
            if commit:
                user.save()
            return user
    
    
    class UserChangeForm(forms.ModelForm):
        """A form for updating users. Includes all the fields on
        the user, but replaces the password field with admin's
        password hash display field.
        """
        password = ReadOnlyPasswordHashField(label="Password",
            help_text=("Raw passwords are not stored, so there is no way to see "
                        "this user's password, but you can change the password "
                        "using <a href="password/">this form</a>."))
    
        class Meta:
            model = models.UserProfile
            fields = ('email','password','is_active', 'is_admin')
    
        def clean_password(self):
            # Regardless of what the user provides, return the initial value.
            # This is done here, rather than on the field, because the
            # field does not have access to the initial value
            return self.initial["password"]
    
    
    class UserProfileAdmin(object):
        # The forms to add and change user instances
        form = UserChangeForm
        add_form = UserCreationForm
    
        # The fields to be used in displaying the User model.
        # These override the definitions on the base UserAdmin
        # that reference specific fields on auth.User.
        list_display = ('id','email','is_admin','is_active')
        list_filter = ('is_admin',)
        list_editable = ['is_admin']
    
        fieldsets = (
            (None, {'fields': ('email','name', 'password')}),
            ('Personal info', {'fields': ('phone','weixin','memo',)}),
    
            ('用户权限', {'fields': ('is_active','is_staff','is_admin','user_permissions','groups')}),
    
        )
        # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
        # overrides get_fieldsets to use this attribute when creating a user.
        add_fieldsets = (
            (None, {
                'classes': ('wide',),
                'fields': ('email',  'password1', 'password2','is_active','is_admin')}
            ),
        )
        search_fields = ('email',)
        ordering = ('email',)
        filter_horizontal = ('user_permissions','groups')
    
    
    
    
    
    
    class HostAdmin(object):
        list_display =  ('id','name','ip_addr','status')
        filter_horizontal = ('host_groups','templates')
    
    
    class HostGroupAdmin(object):
        style_fields = {'templates': 'm2m_transfer'}
    
    
    class TemplateAdmin(object):
        filter_horizontal = ('services','triggers')
        style_fields = {'services':'m2m_transfer','triggers':'m2m_transfer'}
    
    class ServiceAdmin(object):
        filter_horizontal = ('items',)
        list_display = ('name','interval','plugin_name')
        style_fields = {'items': 'm2m_transfer'}
        #list_select_related = ('items',)
    
    
    class TriggerExpressionInline(object):
        model = models.TriggerExpression
        #exclude = ('memo',)
        #readonly_fields = ['create_date']
    
    
    class TriggerAdmin(object):
        list_display = ('name','severity','enabled')
        inlines = [TriggerExpressionInline,]
        #filter_horizontal = ('expressions',)
    
    
    class TriggerExpressionAdmin(object):
        list_display = ('trigger','service','service_index','specified_index_key','operator_type','data_calc_func','threshold','logic_type')
    
    
    class BaseSettings(object):
        enable_themes = True
        use_bootswatch = True
    
    
    class GlobalSettings(object):
        site_title = "大倪的自动化监控系统"
        site_footer = "如有雷同,纯属巧合"
        menu_style = "accordion"
    
    
    # class ServiceIndexAdmin(object):
    #     style_fields = {'idc': 'm2m_transfer'}
    
    
    xadmin.site.register(models.Host,HostAdmin)
    xadmin.site.register(models.HostGroup,HostGroupAdmin)
    xadmin.site.register(models.Template,TemplateAdmin)
    xadmin.site.register(models.Service,ServiceAdmin)
    xadmin.site.register(models.Trigger,TriggerAdmin)
    xadmin.site.register(models.TriggerExpression,TriggerExpressionAdmin)
    xadmin.site.register(models.ServiceIndex)
    xadmin.site.register(models.Action)
    xadmin.site.register(models.ActionOperation)
    #admin.site.register(models.ActionCondtion,ActionConditionAdmin)
    xadmin.site.register(models.Maintenance)
    xadmin.site.register(models.UserProfile,UserProfileAdmin)
    xadmin.site.register(models.EventLog)
    
    xadmin.site.register(views.BaseAdminView,BaseSettings)
    xadmin.site.register(views.CommAdminView,GlobalSettings)
    View Code

    遇到的问题:

    1、

    ManyToManyField类型的字段,在xadmin里只显示了一个选项框。解决方法:
    在定义的类中,加上这个字段,其中templates对应字段名称,效果如下  style_fields = {'templates': 'm2m_transfer'}

  • 相关阅读:
    log4j2配置ThresholdFilter,让info文件记录error日志
    Thrift常见异常及原因分析(<i>UPDATING...</i>)
    fastjson序列化出现StackOverflowError
    mysql执行update语句受影响行数是0
    远程Gitlab新建的分支在IDEA里不显示
    rabbitmq延迟队列demo
    利用延迟消息队列取代定时任务
    利用spring实现服务启动就自动执行某些操作的2种方式
    从Joda-Time反观Java语言利弊
    Linux Shell test判断
  • 原文地址:https://www.cnblogs.com/laonicc/p/6687208.html
Copyright © 2020-2023  润新知