类别归档:python

RSS feed of python

在Amazon Linux 使用 Let's encrypt 免费的SSL

在Amazon Linux 使用 Let's encrypt 免费的SSL

如果你使用ELB来做负载均衡,在AWS上可以很方便的使用SSL。如果不使用ELB就需要自己来配置SSL。
Let's encrypt 提供期限为三个月的免费SSL证书,到期之后需要renew,官方还提供自动renew的工具certbot

certbot

certbot 是一个自动申请和续期SSL证书的工具。在官网certbot.eff.org可以找到各种OS和Web服务器下的安装方法。常见的Ubuntu和CentOS安装起来十分方便。

Amazon Linux

在AWS EC2上,官方推荐的是OS是Amazon Linux,基于RHEL 6源码重新编译的,提供了Amazon自己的工具和源。certbot的安装方式类似于RHEL 6/CentOS 6

申请SSL证书步骤

  • ssh到Server
  • 下载certbot
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
  • 执行certbot
sudo ./certbot-auto --debug ...

继续阅读

单线链表逆序

reverse linklist

https://leetcode.com/problems/reverse-linked-list/

一个链表的逆序
Python和Java的实现
去面试碰到这个题,答题的时候没有太多把握,现在写下来看看。

# -*- coding: utf-8 -*-

# https://leetcode.com/problems/reverse-linked-list/

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None


class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        next_tmp = None
        prev = None
        curr = head

        while curr != None ...

继续阅读

django 几个小 tips

django 几个小 tips

django forms

djang forms 是django非常有用的功能之一,展示表单和接收表单数据非常方便。

css class

比如下面的代码:

n_tz = forms.ChoiceField(choices=TIMEZONE_CHOICE, initial=8, required=True, widget=forms.Select(attrs={"class": "form-control", "id": 'n_tz'}))

实现了两个常用的功能
- 指定css class 和 id
- initial 初始值

动态改变表单验证逻辑

我们经常有这样的需求,field b不是必填项,field c也不是必填项,但是如果b不为空,c也需要不为空。我们可以定义一个 clean_c 的函数(函数名为clean_)来实现这个功能,也可以定义clean函数。

class DemoForm(forms.Form):
    a ...

继续阅读

boto遍历S3

遍历S3

首先你需要一个有S3 list权限的key,如果bucket里面的文件很多的话,推荐使用分页来遍历

session = boto3.Session(aws_access_key_id=<s3_aws_key_id>,
                            aws_secret_access_key=<s3_aws_secret_key>,
                            region_name='us-east-1')
    s3 = session.resource('s3')
    client = session.client('s3')
    paginator = client.get_paginator('list_objects')
    for result in paginator.paginate(Bucket=<s3_bucket>, Prefix=<s3_path_prefix>:
        for content in result.get('Contents'):
            if content.get('Size') > 0:
                print content.get('Key')

分页默认大小是1000,可以修改PageSize,改小可以减少响应时间

paginator ...

继续阅读

djang data migration

djang data migration

在使用django框架开发的过程中,我们不可避免的遇到models层的变更,就涉及到数据库表的变动,django给我提供了一个migration的工具来做这些数据库表的变更。

djang migration

如果不加appname,那么就是指所有包含migrations 目录的app

# 基于当前的model 检测修改,创建迁移策略文件
python manage.py makemigrations <appname>
# 执行迁移动作
python manage.py migrate

migrations失败

有时候如果models改动比较大,migrations会失败,这个时候有两种选择,手工去修改migrations文件,第二种是清除所有migrations,重新migrate

手工修改migrations文件

通过报错信息加上SQL语句找到找到问题,然后具体问题具体分析,是修改数据库里面的数据,还是修改migrations生成的脚本。

python manage.py migrate

python manage.py sqlmigrate <appname> 0001

当处理模型修改的时候:

  • 如果模型包含一个未曾在数据库里建立的字段,Django会报出错信息。 当你第一次用Django的数据库API请求表中不存在的字段时会导致错误。

  • Django不关心数据库表中是否存在未在模型中定义的列。

  • Django不关心数据库中是否存在未被模型表示的table。

在使用SQLite3数据库时, 因为SQLite3 ...

继续阅读

导入pyspark 到 shell 和 pycharm当中

导入pyspark 到 shell 和 pycharm当中

shell

在.bashrc(bash shell) 或者 .zshrc(zshell) 中增加环境变量,具体路径注意自己修改:

export SPARK_HOME="$HOME/spark/spark-1.6.0-bin-hadoop2.6"
export PYTHONPATH="$SPARK_HOME/python/:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH"

然后在python console 可以 import pyspark

pycharm

在PyCharm的menu中找到Run -- Edit Configurations

在Defaults当中找到python, 点击Environment, 增加两行环境变量:

SPARK_HOME="$HOME/spark/spark-1.6.0-bin-hadoop2.6"
PYTHONPATH="$SPARK_HOME ...

继续阅读

AWS S3 本地测试环境的搭建

s3 本地测试环境的搭建

s3 ninja

http://s3ninja.net/ s3 ninja 在本地模拟S3 API, 而且自带一个管理界面, 但是需要修改代码或者增加配置,把endpoint_url指定为 http://localhost:9444/s3

如果我们不想修改代码,可以通过一些简单的配置把请求导向本地 s3 ninja

s3 virtual hosted-style and path-style access

访问s3 bucket上的文件,有两种方式:

# example bucket名字 johnsmith  文件 homepage.html

# Path Style
http://s3.amazonaws.com/johnsmith/homepage.html

# Virtual Hosted–Style
http://johnsmith.s3.amazonaws.com/homepage ...

继续阅读

使用Python操作亚马逊DynamoDB

使用Python操作亚马逊DynamoDB

DynamoDB 是亚马逊AWS提供的一种完全托管的NoSQL数据库,省去部署/监控/维护数据库环节,给开发者节约了大量时间。 而且亚马逊提供了一个本地模拟环境用于测试和开发,我们可以使用本地的DynamoDB.local来学习和熟悉DynamoDB的API。

下载DynamoDB.local

从亚马逊的官方文档可以找到下载地址

解压之后:

dynamodb_local_2015-07-16_1.0$java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
Initializing DynamoDB Local with the following configuration:
Port:   8000
InMemory:   false
DbPath: null
SharedDb:   true
shouldDelayTransientStatuses:   false
CorsParams: *

在浏览器中打开http://localhost:8000/shell/,你会看到DynamoDB javascript shell,在网页上你可以试试javascript API的用法。

image

Boto3

在试用之后javascript ...

继续阅读

最近开发过程中遇到的小问题总结

small tips

最近的工作中遇到一些问题,记录了下来,希望后来的人不要再踩坑了。

all()

all()是python的一个内置函数,官方文档里面说如果所有的元素都为True,all()才返回True。:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

有一些情况需要注意,当list为空时,返回True;空字符串,None,0 的结果都是False。:

>>> all([])
True
>>> all(['a', 'b', 'c'])
True
>>> all(['a', 'b', ''])
False
>>> all(['a', 'b', None])
False
>>> all(['a ...

继续阅读