python 之 django学习笔记

  1. 创建管理员账号:
  2. 也可以手动添加:
    python manage.py shell


     

python web开发框架

Python web开发框架:

Django 、Flask、Tornado、Bottle、Twisted

 

Tornado: http://www.tornadoweb.org/en/stable/

Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.

 

Twisted: https://pypi.python.org/pypi/Twisted/     http://twistedmatrix.com/trac/

An asynchronous networking framework written in Python

 

twisted/tornado 更是一个server,框架部分只是方便使用该server而附带的,不是重点;你可以选择使用tornado server + Django框架, 而对于Bottle框架而言,是允许指定使用哪种server的,支持的server有:

Bottle默认使用的server为: 如下:

所以,有些技术不是同一个层面的,不能相提并论,非此即彼;

 

Django or Flask:

https://www.zhihu.com/question/33538127

 

http://bottlepy.org/docs/dev/index.html

 

http://www.cnblogs.com/suzhigang/p/6208244.html

关于webssh的实现

webssh的关键点:

  1. 选择websocket协议,http不适合
  2. webssh server端需要能:
    1. select websocket的输入,一旦有输入,就转发到ssh server
    2. select ssh server的输出,一旦有输出,就转发到websocket
    3. 要实现上面两点:
      1. 要么自己实现websocket server,因为:
        1. select websocket的输入是websocket server的事情,而select ssh server 的输出是应用逻辑的事情,无法在同一个select上检查这两个fd的事件
      2. 要么websocket server端语言支持多线程
    4. 对于PHP语言,我们实现自己的websocket server比较麻烦,同时,PHP也不支持多线程,所以PHP实现webssh很难
    5. 对于Python语言,因为Python支持多线程,所以,这事儿就好办,jumpserver里面的webssh就是通过多线程实现的

文件打开之“文本模式”与“二进制模式”

php 中关于 fopen函数的说明中,mode参数没有正式提到二进制模式(b),但是在参数说明的列表下面有关于二进制打开方式的说明,并且提到可以使用”b” 来指定二进制模式,这里的二进制模式和文本模式的差别仅仅在于 \r\n 与 \n 之间的差别,和文件编码没有关系。

python中关于“文本模式”和“二进制模式”的差别则在于文件的编码

spring bean 顺序问题

问题:

配置类中明确定义了DataSource bean,但是在另一个类中Autowired的一个jdbcTemplate怎么都装配失败,调试发现,DataSource Bean定义的太晚了,如果提前到jdbcTemplate定义的那个类中就没问题了

另外的解决办法: 其实我们完全可以在配置类上 :

这样的话,只需要在 application.properties 中定义如下即可:

 

logstash-output-syslog 之 facility定义问题

问题:

当我们在logstash-output-syslog中配置facility为local6的时候,实际上走的是local4;而定义facility为local7的时候,实际上走的是local5,但是,定义为daemon的时候,确实是daemon

原因:

  1. 参考源码: https://github.com/phpor/logstash-output-syslog/blob/master/lib/logstash/outputs/syslog.rb 关于facility的定义有一个数组:

    而rfc中的定义如下: https://tools.ietf.org/html/rfc3164#section-4.1.1



    我们发现,4和10的定义是重复的,9和15的定义是重复的; 而插件源码中把这两个重复的条目就简单去掉了,于是就导致facility-code就对不上了
  2. 解决办法: 把重复的两项补回去就可以了

给容器设置网络

  1. 通过pipework给容器添加、配置、期望网络(这个就不说了)
  2. 如果在不重启容器的情况下,禁用容器的网络,然后在需要的时候在启动呢?
    1. 禁用容器网络: ifdown eth0
    2. 启用容器网络: ifup eth0
  3. 如果容器中没有ifup、ifdown、甚至没有ip命令呢?
    1. 通过nsenter -t pid-of-container -n   (进入容器网络名字空间,但是文件系统还是宿主机的)
    2. 执行ip相关命令:

       

      注意: 这里使用的是ip命令,而不是ifconfig、ifup之类的,因为ip命令不参考本地文件系统中的相关配置,而后者会参考本地文件系统相关网络配置;因为我们需要ip命令,所以使用的是宿主机的文件系统,而不是容器的文件系统,所以在这里设置容器网卡的时候,不能使用ifconfig、ifup之类

    3. 在宿主机上使用ip netns exec 也能达到和使用nsenter相同的效果,但是似乎没有发现一个比较好的办法根据pid找到网络名字空间,所以还是nsenter更方便些

paramiko模块学习

第一步:安装

 

rpmbuild 之 devel

我们见过比较专业一些的软件会包含多个rpm包,如:

phpor.1.0.0.el7.x86_64

phpor-docs.1.0.0.el7.x86_64

phpor-devel.1.0.0.el7.x86_64

phpor-debuginfo.1.0.0.el7.x86_64

那么,一个spec文件如何build出来多个rpm包呢?

首先,我们以devel为例,参考: https://stackoverflow.com/questions/2913130/building-both-devel-and-normal-version-of-a-rpm-package

可见,devel是以子包的形式出现的

示例:

http://kmymoney2.sourceforge.net/phb/rpm-example.html

rpmbuild 安装到BUILDROOT 下面的文件和目录都要打包的rpm包中,否则会报错(rpmbuild会认为你遗忘了),如果不想打包,就提前删掉