腾讯蓝鲸论坛-专业的技术交流论坛

 找回密码
 立即加入蓝鲸智云论坛
忘了密码?
搜索
热搜: 用户手册 FAQ
查看: 2228|回复: 9

[经验分享] 蓝鲸开发经验

[复制链接]

1

主题

0

好友

36

积分

预备会员

Rank: 1

发表于 2017-5-3 09:22:03 |显示全部楼层
本帖最后由 皓西科技 于 2017-5-3 09:45 编辑

蓝鲸开发经验
              
        一、开发环境搭建

        二、 创建应用

         三、代码集成开发

         四、应用部署
       


一、开发环境搭建

1、搭建好蓝鲸平台
蓝鲸平台可以正常使用,详见蓝鲸论坛平台搭建  

2、本地数据库搭建
windows需要安装mysql,linux系统可以不搭建数据库,使用系统自带sqlite

3python环境安装
  注意,蓝鲸平台是在python2.7版本上开发的,所以在安装python版本时,版本不能太高,因为python没有版本兼容。
环境变量配置,保证可以通过命令调用python,依赖软件的安装,具体的内容请详见蓝鲸论坛

4、代码管理
安装svn或者是git的客户端,蓝鲸应用开发在创建应用时需要进行代码库的链接配置,本地代码开发也需要进行代码的提交

5、配置hosts文件
开发机器需要进行hosts文件的配置,具体如下:
paas.bking.com,cmdb.bking.com,job.bking.com,dev.bking.com,依据搭建的蓝鲸环境和本机的信息完成hosts文件的配置

6、安装和配置开发工具(IDE
该部分蓝鲸论坛有详细的说明,具体的内容如下:     

Pycharm:http://bbs.bk.tencent.com/forum.php?mod=viewthread&tid=161&fromuid=165

1

主题

0

好友

36

积分

预备会员

Rank: 1

发表于 2017-5-3 09:32:41 |显示全部楼层
本帖最后由 皓西科技 于 2017-5-3 09:47 编辑

二、创建应用

1、确定应用的名称和具体介绍
在代码仓库中进行具体的应用的目录的创建并将代码仓库下载到本地,该步骤是后面的应用的创建和蓝鲸框架代码存放的前提在蓝鲸平台应用创建之前完成可以让后面的工作相对顺利避免问题的发生。

2、登陆蓝鲸平台
登陆蓝鲸平台:http://paas.bking.com 输入用户名密码完成登陆(默认用户名密码为admin/blueking)

3、进入蓝鲸工作台
进入蓝鲸工作台,点击开发者中心,具体如下图
2-1.png


4、创建应用
进入开发者中心后可以看到如下图的页面,创建应用可以点击创建应用的菜单进行直接创建,
也可以通过我的应用中创建应用进行创建

2-2.png

2-3.png

创建应用需要填写的内容主要包括(应用ID、应用名称、应用简介、负责人、代码仓库的类型SVN或者GIT,仓库的用户名、仓库的密码)从上面信息可以看出,应用在创建前需要先进行代码库的创建(步骤1),如果代码库的相关信息填写不正确会导致应用无法正常部署,另外应用ID、应用名称、应用简介内容可以相同,但是为了方便对应用的详细了解,建议详细填写。  

5、应用创建成功

应用创建成功之后具体页面如下:
2-4.png
     

到此,我们在蓝鲸上的应用就已经完成创建,下面可以进行具体的应用框架搭建和代码的编写,详细内容请查看下一节内容。   

1

主题

0

好友

36

积分

预备会员

Rank: 1

发表于 2017-5-3 10:05:41 |显示全部楼层
本帖最后由 皓西科技 于 2017-5-3 10:16 编辑

三、代码集成开发

1)框架搭建和配置

1、在IDE中完成应用仓库的地址配置,并将具体的代码库目录下载到本地
2、蓝鲸代码框架的代码下载,具体位置详见下图:
         3-1.png

      
按照上面的地址位置,将开发框架下载到本地目录,解压开发框架压缩包,将压缩包内的文件解压到代码仓库在本地对应的目录下
3、调整配置,将应用对应信息配置到框架代码中,具体的配置信息如下:
·       default.py 配置文件调整,具体配置包括APP_ID、APP_TOKEN、BK_PAAS_HOST,APP_ID 和 APP_TOKEN在创建应用时已经创建好了,具体请查看应用基本信息页面,BK_PAAS_HOST 默认请填写蓝鲸智云开发者中心的域名,形如:http://paas.bking.com   

3-2.png

3-3.png
        settings_development.py 开发环境配置文件调整需要对数据库的相关信息进行配置,数据库       名称建议与APP_ID相同,其他配置根据具体的信息进行相应调整,如使用sqlite数据库,ENGINE填写:
django.db.backends.sqlite3,使用sqlite数据库只要填写数据库名称,其他的都不需要填写,具体可以参考测试环境的配置
3-4.png

        settings_testing.py 测试环境配置文件调整具体需要调整的配置信息与开发环境相同,只需要根据具体环境进行相应变化即可,详情如下:
3-5.png

        settings_production.py 生产环境配置文件调整具体需要调整的配置信息与开发环境相同,只需要根据具体环境进行相应变化即可,详情如下  
3-6.png


    上述的所有的配置调整完成之后,这时使用命令行进入应用所在根目录,执行python manage.py runserver 可以正常启动如下图1,但是使用浏览器访问http://dev.bking.com:8000/ 地址页面会报错,错误的信息如下面的图 2,报错的原因是蓝鲸平台应用的开发过程中需要使用蓝鲸平台中认证等各种模块,这些模块需要进行内置表的数据访问,所以在完成配置修改后还需要在本地执行命令将蓝鲸登陆认证等模块的表结构创建出来。具体执行的命令是:python manage.py migrate 命令执行的结果见图3,成功创建表之后重新执行图1的命令并调用图2的地址在浏览器访问具体结果如下图4,进入图4页面说明要使用的蓝鲸的框架已经搭建和配置完成,服务器正常启动。
3-7.png

                          图1

3-8.png

                          图2
3-9.png

                       图3
3-10.png

                       图4

完成面上的工作之后,我们就可以进行我们自己应用的开发工作了,具体详情请查看下一节内容。

1

主题

0

好友

36

积分

预备会员

Rank: 1

发表于 2017-5-3 10:31:36 |显示全部楼层
2HelloWorld

[url=]    通过上一节的操作,我们已经可以将蓝鲸的应用的开发包正常运行起来,在进入真正的应用的开发工作之前,我们先进行一个简单的例子开发,在页面上打印“Hello World!!在开发过程中熟悉蓝鲸的开发框架的结构和功能。
[/url]    为了很好的学习蓝鲸的调用过程,我们从下面几个包和文件进行学习,首先我们访问http://dev.bking.com:8000/时访问的是域名下的空缺路径查看框架代码时我们可以找到在根目录下有一个叫 urls.py 的文件,我们打开这个文件可以看到下面的具体内容见下图1,空缺的根目录指向home_application.urls
3-2-1.png

                            图1
  查看框架目录可以找到名为home_application的包,打开包可以看到包下面也存在一个叫urls.py 的文件,框架的地址调用是通过urls文件来进行定向和指定的,打开home_application.urls内容如图2所示 urlpatterns匹配到home_application.views 缺省调用指向home 从这可以看出路径调用转化成具体的views中的方法调用。
3-2-2.png

                          图2
打开home_application 包下面的 views.py 文件,具体内容如下图3。文件中有三个方法,第一个方法就是home方法,该方法直接返回 /home_application/home.html 这里要说明一下,页面的文件框架统一放在templates文件夹下面。
3-2-3.png

                          图3
    打开templates文件夹,文件夹中有home_application文件夹,此文件夹下面有home.html页面文件,该文件是我们在访问缺省路径打开的页面文件。
3-2-4.png

                         图4
通过上面的调用过程的解读,我们可以清晰的学习到整个蓝鲸框架调用的过程,下面我们实现Hello World!!,具体是在页面访问http://dev.bking.com:8000/demourl时展示HelloWorld!!页面。具体步骤如下:
1、创建功能需要的目录和文件,具体的内容请查看下图:
3-2-5.png

           2、实现根url下的调用和指向,在根目录下的urls.py文件中添加一个url路径定向(url(r'^demo', include('demo.urls'))^demo^demo/的区别是前者用于该路径后面没有子路径的情况,后者用于该目录下还会有多个子路径,子路径的配置在具体功能目录下的urls.py文件中进行配置,具体的内容如下:

3-2-6.png

3、在具体功能模块下的urls.py文件中添加具体的路径映射,详情详见下图:图中表示的是统配所有路径的地址映射,如果希望在demo路径下细分子路径访问,这里要强调的是如果需要在demo目录下细分子路径的话必须在根目录的urls.py 文件中 配置为demo/,参见步骤2,按照下图完成路径的映射。
3-2-7.png

         4、创建views.py 文件,在文件中添加下面的内容,定义了在urls.py 文件中映射的方法函数,该方法的内容是返回一个页面,页面内容比较简单  
3-2-8.png
  
上面的开发工作完成后,我们的demo功能简单的开发完成,下面截图是具体的实现的页面效果
访问demo路径,具体如下图
3-2-9.png

访问demo目录下的demo1路径,具体的如下图
3-2-10.png


到此一个简单的功能开发完成。Hello World!!

1

主题

0

好友

36

积分

预备会员

Rank: 1

发表于 2017-5-3 10:43:22 |显示全部楼层
3)框架

上一节内容我们简单学习了简单功能的开发,本节主要针对框架的结构进行简单的讲解,话不多说,先上一张结构图:
3-3-1.png

这里有几个内容需要重点讲解一下,具体内容分为下面几点:
1、conf 包中存放应用中使用到的所有配置文件,在开发应用时如果需要添加配置文件统一放在这个包里,默认应用框架里包括四个配置文件
具体每个配置文件的作用在之前的章节里已经进行了说明,此处不再赘述,考虑到default配置文件中的配置比较多,这里针对比较常用的几个
配置进行具体说明:
Ø  SITE_URL:应用访问路径
Ø  STATIC_URL:应用本地静态资源目录
Ø  PROJECT_PATH:项目路径
注意:上面的配置获取不要直接引用default.py文件,正确的引用的方式是引用setting,例如需要使用本地静态资源目录具体的引用方式如下:
fromsettings import STATIC_URL
3-3-2.png

2、urls.py
根URL,即所有URL的总入口,这个文件的使用在上一节开发一个简单demo功能中进行了详细讲解,请查看上一节内容
3、requirements.txt
这个文件是用来约定应用中依赖的一些第三方python包在线上自动部署自动安装,具体格式是:“包名称==版本号
3-3-3.png

4、templates
这个文件夹用于存放模板文件(html页面模板),该文件夹是根目录,如果开发的应用需要添加模板文件请自行创建子目录进行存放
5、static
本地静态文件放置目录,该文件夹是根目录,如果开发的应用需要添加本地静态文件请自行创建子目录进行存放
6、app_control
功能开关示例,用于控制一些功能接口在访问时给予友好的拒绝访问提示,具体的使用方法请查看专题章节内容
7、blueking
      ESB组件相关功能,具体的使用方法请查看蓝鲸论坛:http://bbs.bk.tencent.com/forum.php?mod=viewthread&tid=306&extra=page%3D1   
  

1

主题

0

好友

36

积分

预备会员

Rank: 1

发表于 2017-5-3 10:54:13 |显示全部楼层
4)数据、表相关

蓝鲸的应用开发框架是基于Django的,所以我们在学习数据库与表这块我们只需要研究在Django中是如何定义表机构和数据库操作的
首先看下下面的代码
  1. # -*- coding: utf-8 -*-
  2. from django.utils import timezone
  3. from django.db import models
  4. from common.log import logger
  5. class Function_Manager(models.Manager):
  6.     def func_check(self, func_code):
  7.         """
  8.         @summary: 检查改功能是否开放
  9.         @param func_code: 功能ID
  10.         @return: (True/False, 'message')
  11.         """
  12.         try:
  13.             enabled = self.get(func_code=func_code).enabled
  14.             return (True, int(enabled))
  15.         except Exception, e:
  16.             logger.error(u"检查改功能是否开放发生异常,错误信息:%s" % e)
  17.             return (False, 0)
  18. class Function_controller(models.Model):
  19.     ""
  20.     功能开启控制器
  21.     """
  22.     func_code = models.CharField(u"功能code", max_length=64, unique=True)
  23.     func_name = models.CharField(u"功能名称", max_length=64)
  24.     enabled = models.BooleanField(u"是否开启该功能", help_text=u"控制功能是否对外开放,若选择,则该功能将对外开放", default=False)
  25.     create_time = models.DateTimeField(u"创建时间", default=timezone.now)
  26.     func_developer = models.TextField(u"功能开发者", help_text=u"多个开发者以分号分隔", null=True, blank=True)
  27.     objects = Function_Manager()
  28.     def __unicode__(self):
  29.         return self.func_name
  30.     class Meta:
  31.         app_label = 'app_control'
  32.         verbose_name = u"功能控制器"
  33.         verbose_name_plural = u"功能控制器"
复制代码
上面的代码摘自蓝鲸引用开发框架,针对表结构的我们大概分下面几个部分进行讲解:
1、如何创建数据库表模型,Function_controller是对应数据库的模型类,models.Model是Django中模型类对象的父类,所有的数据模型对象都要继承该类,如果这里需要继承其他类为父类只需要将models.Model替换成相应的类即可,要说明的是Django模型类可以同时继承多个类做父类,模型类的内容包括属性的定义,方法定义。
        2DjangoModel的增删改查方法是直接操作对象,下面我们列举几个例子,例子摘抄自网上与上面的代码关系不大,但是足够说明操作使用

  1. models.UserInfo.objects.create(user='yangmv',pwd='123456')
  2. 或者
  3. obj =  models.UserInfo(user='yangmv',pwd='123456')
  4. obj.save()
  5. 或者
  6. dic = {'user':'yangmv','pwd':'123456'}
  7. models.UserInfo.objects.create(**dic)
复制代码

  1. models.UserInfo.objects.filter(user='yangmv').delete()
复制代码

  1. models.UserInfo.objects.filter(user='yangmv').update(pwd='520')
  2.   
  3. 或者
  4.   
  5. obj =  models.UserInfo.objects.get(user='yangmv')
  6.   
  7. obj.pwd = '520'
  8.   
  9. obj.save()
复制代码

  1. models.UserInfo.objects.all()
  2.   
  3. models.UserInfo.objects.all().values('user')    #只取user列
  4.   
  5. models.UserInfo.objects.all().values_list('id','user')    #取出id和user列,并生成一个列表
  6.   
  7. models.UserInfo.objects.get(id=1)
  8.   
  9. models.UserInfo.objects.get(user='yangmv')
复制代码
3、objects = Function_Manager() 这里要说下,这个是定义模型的增删改查等操作方法的类,具体参见代码,写法格式必须要按照这种方式来写,模块manager是一个对象,Django模块通过它进行数据库查询。 每个Django模块至少有一个manager,你可以创建自定义manager以定制数据库访问,manager并非强制必须写的,只是这样写可以更好的管理我们对于数据库表的操作,方便调整,使用更透明降低了业务与数据的耦合性。详细更高级的用法大家可以百度一下,可以获取更多的资料。
4、class Meta:Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性。总结的话大家可以看下下面的帖子:
      5、创建好表结构之后我们需要将创建好的模型映射创建到对应的数据库中去,这里操作也比较简单,执行两行命令就可以完成,具体的命令如下:   
  • python manage.py makemigrations
  • python manage.py migrate   
6、表结构的修改:表结构修改后,原来表中已存在的数据,就会出现结构混乱,makemigrations更新表的时候就会出错
        
        解决方法:
        ①、新增加的字段,设置允许为空。生成表的时候,之前数据新增加的字段就会为空。(null=True允许数据库中为空,blank=True允许admin后台中为空)
        、新增加的字段,设置一个默认值。生成表的时候,之前的数据新增加字段就会应用这个默认值
3-3-4.png

执行makemigrations, migrate 后。老数据会自动应用新增加的规则
3-3-5.png
  
本节只是简单的总结讲解了表操作和数据库相关的一些操作,其他的使用这里就不做赘述,希望更深学习这块的话可以百度进行查询和学习。   

1

主题

0

好友

36

积分

预备会员

Rank: 1

发表于 2017-5-3 11:09:50 |显示全部楼层
5token相关

这部分打算说两个内容,一个是如何在页面添加蓝鲸的token认证功能,一个是在开发过程中如何让接口跳过token认证。
1、页面添加token认证:这个比较简单,蓝鲸已经进行了封装。只需要在页面中引用下面的JS脚本   
scripts.png


2、接口调试跳过token验证:为了开发调试效率我们在开发过程中希望可以不进行token的验证。具体操作需要两步:
  • 首先在需要跳过token验证的代码文件中引用下面的这个Python包
  1. from django.views.decorators.csrf import csrf_exempt
复制代码
  • 完成引用后在具体的方法上加上对应的注解,请参见下面的代码
  1. def get_host_list(request):
  2.     appid = request.POST.get('appid')
  3.     print appid
  4.     # 获取服务器信息
  5.     fuwuqiresult = mytasks.GetAppHostList(request, 3)
  6.     hostjson = json.dumps(fuwuqiresult)
  7.     hostjson1 = json.loads(hostjson)
  8.     result = []
  9.     for i in hostjson1['data']:
  10.         result.append(i['InnerIP'])
  11.     logger.info(u"获取服务器信息::%s" % str(result))
  12.           return  render_json({'result':True,'fuwuqiresult':result});
复制代码
在调试get_host_list接口是框架将不对token进行验证。

1

主题

0

好友

36

积分

预备会员

Rank: 1

发表于 2017-5-3 11:24:07 |显示全部楼层
本帖最后由 皓西科技 于 2017-5-3 11:28 编辑

6)路径相关

路径问题是我们在开发当中经常遇到的问题,在这我们针对前端页面和后端的代码两部分就路径问题进行说明。
    1、页面上获取工程环境的相对路径:如下图所示,在应用的所有JS之前添加下面的JS脚本,在应用的JS中就可以方便的使用下面的全局变量,${STATIC_URL}对应的是静态资源的url路径,它可以依据目录结构和环境返回正确的访问路径,在页面需要加载某些图片或者其他静态文件时正确的写法是${STATIC_URL}+文件在工程下的相对路径,${SITE_URL}这个对应appurl前缀,ajax调用的时候,应该加上该前缀,就是说我们在访问应用的API接口是,访问路径要按照相对路径的写法来写,相对路径前面添加对应的url前缀,才能保证接口的正常访问。
3-6-1.png


3-6-2.png


3-6-4.png


2、针对应用后端的业务功能代码,也需要获取上述的URL,完成功能,在代码这部分获取URL也比较简单,在介绍蓝鲸应用框架的时候我们对所有框架下的包和文件进行了说明,其中有一个文件就是针对URL等配置获取的settings.py(配置相关,动态获取conf中的配置)代码中我们只需要引用settings即可完成路径的获取,具体请看下面截图,正确引用之后便可以在代码中直接使用了。
3-6-5.png


7)接口调试
在应用开发过程中,页面前端开发和后端接口的开发一直都是分开开发,各自完成开发后在进行接口联调工作,这就需要做后台开发的伙伴能够独立进行接口的测试,这里我给出了一个模拟前端访问的方式来进行接口测试,具体请查看下面的截图,蓝鲸平台对身份进行验证,所以在进行接口测试时需要进行相应的配置,具体需要配置的信息有:Content-Type:application/x-www-form-urlencoded,POST请求需要传的参数例如(triggerids=18638,18315,16277,16276,16274),Cookie信息,这个在完成登陆之后从页面可以抓取到X-CSRFToken信息也是在登录之后生成的,上面这些信息填写完整之后就可以正常拿到接口应有的返回信息。
3-7-1.png


3-7-2.png


上面是POST请求的示例,对于GET请求的区别在与参数的传递是拼接在请求路径之后的,其他的配置参数全都相同,所以这里就不多赘述了,后面将针对单元测试这块进行完善,目前阶段先对工具模拟进行讲述。
3-6-3.png

1

主题

0

好友

36

积分

预备会员

Rank: 1

发表于 2017-5-3 11:33:51 |显示全部楼层
8)功能开关
支持用户在应版本开发迭代中,对功能选择性开放进行灰度测试等。
用户需要在app_control_function_controller表中添加功能信息,并使用装饰器,示例代码如下:

3-8-1.png

3-8-2.png


功能示例:
3-8-3.png


9)日志相关
蓝鲸应用开发框架中的日志配置是集中管理的,所有日志相关的配置都放在default.py文件中,详情请查看下面截图:

3-9-1.png

代码中如需要输出执行过程或者结果到日志文件中,可以在相应的代码中添加日志的引用from common.log import logger 在相应的
方法函数中直接使用logger进行具体的内容输出。

1

主题

0

好友

36

积分

预备会员

Rank: 1

发表于 2017-5-3 12:05:08 |显示全部楼层
本帖最后由 皓西科技 于 2017-5-3 12:06 编辑

四、应用部署   

    完成应用代码获取及开发,就可以进行部署操作。请检查应用服务器已按照要求注册,并安装PaasAgent 及激活。   

1、测试部署    
将应用代码在测试环境上进行部署,部署成功后用户即可以访问应用测试环境服务。 如果有功能更新,请提交代码至代码仓库,并重新【测试部署】即可。
4-1.png


4-2.png



2、正式部署    
    将应用代码在正式环境上进行部署,部署成功后用户即可以访问应用正式环境服务。 已上线的应用需要进行【测试部署】并在测试完成后, 才能再次进行【正式部署】。

4-3.png


4-4.png


3、下架
系统将应用代码从用户选择的环境上撤销部署,届时用户将无法访问该应用。用户可以进行【测试部署】操作,重新部署应用。注:下架操作不会删除应用数据库及已有数据。可以单独对测试环境或者生产环境进行下架,也可以一起下架    

4、历史纪录
     用户每次测试、正式部署及下架都有操作记录,用户可以在应用发布历史-》发布记录中查看。
4-6.png

5、版本历史
    应用在正式部署时,需要填写本次部署更新的特性信息以及修复的BUG,并作为应用的版本信息存储。
4-7.png

上面内容就是蓝鲸第三方开发应用的部署操作内容,除此之外,蓝鲸还 有内部应用的部署,这部分内容待后续完善。


蓝鲸官网

GMT+8, 2018-4-26 15:36

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部