himawari8图片下载改进版

Posted in 2017-3-23 11:42 | Category: Python | Tags: earth himawari8 python

第一版下载图片后设为壁纸,四周都是黑黑的不好看, 所以结合本地壁纸将两张图片进行合成

只要计算一下要缩减的大小与要放置的位置

我的方法是:打开 gimp,合成两张图片,记下缩减的大小(214,214)与位置(160,160)

每次只要运行一下

python himawari8.py

源码

from PIL import Image, ImageOps, ImageDraw
from io import BytesIO
from urllib.request import Request, urlopen
from datetime import datetime, timedelta
import json

SCALE = 2
WIDTH = 1368
HEIGHT = 768


def get_info():
    url = "http://himawari8-dl.nict.go.jp/himawari8/img/D531106/latest.json"
    request = Request(url)
    response = urlopen(request, timeout=10)
    return json.loads(response.read())


def download():
    png = Image.new('RGB', (550 * SCALE, 550 * SCALE))
    # desktop = Image.new('RGB', (WIDTH, HEIGHT))
    desktop = Image.open('/home/jianglin/Pictures/308556.png')
    url_format = 'http://himawari8-dl.nict.go.jp/himawari8/img/D531106/{}d/{}/{}_{}_{}.png'
    info = get_info()
    # date = datetime.strptime(info['date'], '%Y-%m-%d %H:%M:%S') + timedelta(
    #     hours=-8)
    date …

下载Himawari8拍摄的实时地球图片

Posted in 2017-3-22 22:10 | Category: Python | Tags: earth himawari8 python

设置壁纸

feh --bg-scale /tmp/earth.png

设置桌面大小,及图片放大倍数

SCALE = 4
WIDTH = 1368
HEIGHT = 768

直接给出源码

from PIL import Image
from io import BytesIO
from urllib.request import Request, urlopen
from datetime import datetime
import json

SCALE = 4
WIDTH = 1368
HEIGHT = 768


def get_info():
    url = "http://himawari8-dl.nict.go.jp/himawari8/img/D531106/latest.json"
    request = Request(url)
    response = urlopen(request, timeout=10)
    return json.loads(response.read())


def download():
    png = Image.new('RGB', (550 * SCALE, 550 * SCALE))
    desktop = Image.new('RGB', (WIDTH, HEIGHT))
    url_format = 'http://himawari8-dl.nict.go.jp/himawari8/img/D531106/{}d/{}/{}_{}_{}.png'
    info = get_info()
    date = datetime.strptime(info['date'], '%Y-%m-%d %H:%M:%S')
    for x in range(SCALE):
        for y in range(SCALE):
            url = url_format.format(SCALE, 550,
                                    date.strftime("%Y/%m …

使用flask实现的一个简单的图片上传存储服务

Posted in 2017-3-14 6:16 | Category: Python | Tags: linux flask python

maple-file

使用flask实现的一个简单的图片上传服务

设计初衷

对于图片的存储,有很多选择,一般采用云服务如(七牛,又拍等),但是国内的服务像七牛 自定义域名竟然需要域名备案(Excuse me,当初就是因为备案麻烦才选择国外的),而且浪费了我十块钱,

而我又想像七牛一样可以直接在本地就可以上传图片,找来找去,没有找到一个比较合适的,所以花两天时间自己写了一个

使用

由于初衷是本地脚本就可以发布,所以没有前端界面,等以后有时间了再加上

API

  • /api/login
    • POST 登录
  • /api/logout
    • GET 注销
  • /api/albums
    • GET 获取相册列表
    • POST 新建相册
      • name 相册名称
      • description 相册描述
  • /api/albums/

    pk 相册ID

    • GET 获取相册信息
    • PUT 修改相册信息
      • name 相册名称
      • description 相册描述
    • DELETE 删除相册
    • /api/images
    • GET 获取图片列表
    • POST 上传图片
      • images 上传图片列表
      • album 相册ID(默认会新建一个default相册)
    • /api/images/
    • GET 获取图片信息
    • PUT 修改图片信息
      • name 图片名称
      • description 图片描述
    • DELETE 删除图片

配置

class Config(object):
    DEBUG = True # 生产环境设置为False
    SECRET_KEY = 'ccc' # import os;os.urandom(24)
    SECRET_KEY_SALT = 'ssss'
    JSON_AS_ASCII …

sqlalchemy使用上的小tip

Posted in 2017-3-14 6:16 | Category: Python | Tags: django sqlalchemy python

GitHub地址: https://github.com/honmaple/maple-json

sqlalchemy object序列化为json

灵感来源于 Django REST framework

多个实例

posts = Post.query.all()
serializer = Seralizer(posts,many=True)
data = serializer.data

单个实例

post = Post.query.first()
serializer = Seralizer(post,many=False)
data = serializer.data

排除字段

serializer = Seralizer(post,exclude=['title'])

仅包括字段

serializer = Seralizer(post,include=['title'])

关系查询深度

serializer = Seralizer(post,depth=3)
  • depth 默认为2

增加一些自定义的函数

serializer = Serializer(post,extra=['get_post_count'])

Post

class Post(Model):
    ......
    def get_post_count(self):
        return 11

可传递参数的函数

class PostSerializer(Serializer …

django获取当前request

Posted in 2017-1-10 19:3 | Category: Python | Tags: django python

参考链接:

https://blndxp.wordpress.com/2016/03/04/django-get-current-user-anywhere-in-your-code-using-a-middleware/

http://nedbatchelder.com/blog/201008/global_django_requests.html

使用中间件

from __future__ import absolute_import, division, print_function

try:
    from threading import local
except ImportError:
    from django.utils._threading_local import local

_thread_locals = local()

def get_current_request():
    """ returns the request object for this thread """
    return getattr(_thread_locals, "request", None)

def get_current_user():
    """ returns the current user, if exist, otherwise returns None """
    request = get_current_request()
    if request:
        return getattr(request, "user", None)

class ThreadLocalMiddleware(object):
    """ Simple middleware that adds the request object in thread local stor    age."""

    def process_request(self, request):
        _thread_locals.request = request

    def process_response(self, request, response):
        if hasattr(_thread_locals, 'request'):
        del _thread_locals.request
            return response

升级至python3.6导致环境出错解决

Posted in 2017-1-9 23:40 | Category: Linux | Tags: python3 linux python i3wm

最近archlinux升级至了 python3.6 ,直接导致了我的开发环境失效,唉

archlinux 果然不适合开发

虽然后面都已经解决了

事故(一)

virtualenv不可用,原先使用python3.5创建的环境直接不能用了,只好删了原有了东西,重新使用python3.6创建

pip freeze > requestments.txt
pip install -r requestments.txt

事故(二)

py3status 报错

   Traceback (most recent call last):
  File "/usr/bin/py3status", line 11, in <module>
    load_entry_point('py3status==3.3', 'console_scripts', 'py3status')()
  File "/usr/lib/python3.6/site-packages/pkg_resources/__init__.py", line 561, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2631, in load_entry_point
    return ep.load()
  File "/usr/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2291, in load
    return self.resolve()
  File "/usr/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2297, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level …

开发环境初始化(centos7)

Posted in 2016-12-26 14:56 | Category: Linux | Tags: centos redis linux python mysql

新建用户

[root@localhost]# passwd honmaple
Changing password for user honmaple.
New password:
BAD PASSWORD: The password contains the user name in some form
Retype new password:
passwd: all authentication tokens updated successfully.

安装mysql

参考步骤: http://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/

下载安装

[root@localhost]# wget http://dev.mysql.com/get/mysql57-community-release-el6-8.noarch.rpm
[root@localhost]# rpm -Uvh mysql57-community-release-el6-8.noarch.rpm
[root@localhost]# yum list installed | grep mysql
mysql57-community-release.noarch     el6-8                          installed
[root@localhost]# yum install mysql-community-server
错误:软件包:2:postfix-2.10.1-6.el7.x86_64 (@anaconda)
          需要:libmysqlclient.so.18(libmysqlclient_18)(64bit …

Python中的__main__函数

Posted in 2016-12-14 13:30 | Category: Python | Tags: python

Table of Contents

__main__

转自 这里

很多新手刚开始学习python的时候经常会看到python 中 name = 'main' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中 name = 'main' 的作用,到底干嘛的?

有句话经典的概括了这段代码的意义:

“Make a script both importable and executable”

意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行。 这句话,可能一开始听的还不是很懂。下面举例说明: 先写一个模块:

#module.py
def main():
    print("we are in %s" % __name__)

if __name__ == '__main__':
    main()

这个函数定义了一个main函数,我们执行一下该py文件发现结果是打印出

we are in __main__

说明我们的if语句中的内容被执行了,调用了 main(): 但是如果我们从另我一个模块导入该模块,并调用一次main()函数会是怎样的结果呢?

#anothermodle.py
from module import main
main()

其执行的结果是:

we are in module

但是没有显示

"we are in __main__"

也就是说模块 name = 'main' 下面的函数没有执行。 这样既可以让“模块”文件运行,也可以被其他模块引入,而且不会执行函数2次。这才是关键。

总结一下:

如果我们是直接执行某个.py文件的时候,该文件中那么

__name__ == '__main__'

True, 但是我们如果从另外一个.py文件通过import导入该文件的时候,这时name = 'main'的值就是我们这个py文件的名字而不是name = 'main'。 这个功能还有一个用处:调试代码的时候,在

if __name__ == '__main__'

中加入一些我们的调试代码, 我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!

sqlalchemy序列化为json

Posted in 2016-12-13 7:53 | Category: Python | Tags: flask sqlalchemy python

为什么需要这个需求?

sqlalchemy 是个好东西,虽然其文档犹如老太婆的裹脚布--又臭又长,饱受诟病

使用 restful 时sqlalchemy返回的是一个 object 类,假设前后端分离,前端无法处理

如何实现?

直接给出代码

class Serializer(object):

    def __init__(self, instance, many=False, include=[], exclude=[], depth=2):
        self.instance = instance
        self.many = many
        self.include = include
        self.exclude = exclude
        self.depth = depth

    @property
    def data(self):
        if self.include and self.exclude:
            raise ValueError('include and exclude can\'t work together')
        if self.many:
            if isinstance(self.instance, list):
                return self._serializerlist(self.instance, self.depth)
            pageinfo = {
                'items': True,
                'pages': self.instance.pages,
                'has_prev': self.instance.has_prev,
                'page': self.instance.page,
                'has_next': self.instance.has_next,
                'iter_pages': list(self.instance.iter_pages(left_edge=1,
                                                            left_current …

flask使用token进行验证

Posted in 2016-12-13 3:32 | Category: Python | Tags: flask python token

为什么需要用token验证

原因呢是因为写博客时已经在本地写好了,但是要发表到网站上还需要这么几步:

  • [X] 打开浏览器
  • [X] 打开我的网站
  • [X] 进入登陆页
  • [X] 登陆
  • [X] 进入后台页
  • [X] 进入文章发表页
  • [X] 复制粘贴
  • [X] 发表

所以使用token验证成为必然

如何使用token?

生成token

使用itsdangerous对token进行加密

class User(model):
    ......

    @property
    def token(self):
        config = current_app.config
        secret_key = config.setdefault('SECRET_KEY')
        salt = config.setdefault('SECURITY_PASSWORD_SALT')
        serializer = URLSafeTimedSerializer(secret_key)
        # column = self.(需要加密的字段)
        token = serializer.dumps(column, salt=salt)
        return token

请保管好SECRET_KEYSECURITY_PASSWORD_SALT,不要泄露

验证token

class User(Model):
    ......

    @staticmethod
    def check_token(token, max_age=86400):
        config = current_app.config
        secret_key = config.setdefault('SECRET_KEY')
        salt = config.setdefault('SECURITY_PASSWORD_SALT')
        serializer = URLSafeTimedSerializer(secret_key)
        try:
            column = serializer.loads(token, salt=salt, max_age=max_age)
        except BadSignature:
            return False
        except SignatureExpired:
            return False
  • max-age 最大过期时间 …

利用网易云api获取歌曲信息

Posted in 2016-12-11 4:4 | Category: Python | Tags: python

最近是增加了一个aplayer在网站上,但原本想要使用qiniu存储,最后觉得太麻烦了,直接利用网易云api获取歌曲

使用python标准库urllib

直接给出代码

from urllib import request
import json

id = '28819878'
url = "http://music.163.com/api/song/detail/?id=" + id + "&ids=%5B" + id + "%5D&csrf_token"
rep = request.urlopen(url).read().decode('UTF-8')
rep = json.loads(rep)['songs'][0]
name = rep['name']
artist = rep['artists'][0]['name']
mp3url = rep['mp3Url']
picurl = rep['album']['blurPicUrl']
print('name:', name)
print('artists:', artist)
print('mp3:', mp3url)
print('pic:', picurl)
url = 'http://music.163.com/api/song/media?id=' + id
rep = request.urlopen(url).read().decode('UTF-8')
lyric = json.loads(rep)['lyric']
print('lyric:\n', json.dumps(lyric))

结果

#+RESULTS:
: name: 轨迹
: artists: 徐小薇
: mp3: http://m2.music.126.net/1vGFlmmY1NeHEZy_1QuYhA==/5898879883333738.mp3
: pic: http://p4.music.126.net/EMS4GE-ojql3azwxXYPT3w==/3264450024433079.jpg
: lyric:
:  "[00:12.98 …

常用正则表达式

Posted in 2016-11-25 2:42 | Category: Python | Tags: python regex

常用代码片段

Posted in 2016-10-17 13:5 | Category: Coding | Tags: python

得到当天0点时间

today = datetime.datetime.today()
b = datetime.datetime(today.year, today.month, today.day, 0, 0, 0)
print(b)

now = time.time()
midnight = now - (now % 86400) + time.timezone
itime = time.ctime(midnight)
print(itime)

python时间或时间戳与字符串转换

#把datetime转成字符串
def datetime_toString(dt):
    return dt.strftime("%Y-%m-%d-%H")

#把字符串转成datetime
def string_toDatetime(string):
    return datetime.strptime(string, "%Y-%m-%d-%H")

#把字符串转成时间戳形式
def string_toTimestamp(strTime):
    return time.mktime(string_toDatetime(strTime).timetuple())

#把时间戳转成字符串形式
def timestamp_toString(stamp):
    return time.strftime("%Y-%m-%d-%H", time.localtime(stamp))

#把时间戳转成datetime
def timestamp_toDatetime(stamp):
    return datetime.fromtimestamp(stamp …

pip安装mysql-python出错

Posted in 2016-9-28 11:7 | Category: Python | Tags: pip python mysql

Table of Contents

Collecting mysql-python
  Using cached MySQL-python-1.2.5.zip
    Complete output from command python setup.py egg_info:
    sh: mysql_config: 未找到命令
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-g21LDi/mysql-python/setup.py", line 17, in <module>
        metadata, options = get_config()
      File "setup_posix.py", line 43, in get_config
        libs = mysql_config("libs_r")
      File "setup_posix.py", line 25, in mysql_config
        raise EnvironmentError("%s not found" % (mysql_config.path,))
    EnvironmentError: mysql_config not found

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-g21LDi/mysql-python/

Mac

参考问题

brew install mysql
export PATH=$PATH:/usr/local/mysql/bin
pip install MySQL-Python

Centos

yum install python-devel mysql-devel

python的匿名函数lambda

Posted in 2016-8-13 11:20 | Category: Python | Tags: python lambda

参考文档

lambda arguments: expression

等于

def <lambda>(arguments):
    return expression

举例

def add(a,b):
    return a + b
print(add(1,3))

可以写成这样

add = lambda a,b:a+b
print(add(1,3))

从上可以看出 lambda 的语法

lambda [arg1[,arg2,arg3....argN]]:expression

Python二分查找实现

Posted in 2016-8-5 20:55 | Category: Python | Tags: python 算法 二分查找

三种方法实现:

def find(a, low, high, v):
    mid = low + (high - low) // 2
    if v < a[0] or v > a[-1]:
        return False
    if mid >= len(a):
        return False
    if a[mid] == v:
        return True
    elif a[mid] > v:
        return find(a, low, mid - 1, v)
    else:
        return find(a, mid + 1, high, v)

def find2(a, low, high, v):
    mid = low + (high - low) // 2
    if v < a[0] or v > a[-1]:
        return False
    if a[mid] == v:
        return True
    elif a[mid] < v:
        low = mid
    else:
        high = mid
    return find2(a, low, high, v)

def find3(a, v):
    n = len(a)
    low = -1
    high = n
    ret = True
    while (low + 1 != high):
        mid = low + (high - low) // 2
        if (a[mid] == v …

python列表reverse后结果为None

Posted in 2016-8-1 0:35 | Category: Python | Tags: python

今天在实现列表倒序时偶然发现

print(list.reverse())

#+RESULTS:
: None

返回为空,搜索了一下,才知道原来reverse是在原列表进行的操作,所以正确的方法是:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
a.reverse()
print(a)

#+RESULTS:
: [0, 9, 8, 7, 6, 5, 4, 3, 2, 1]

同样的适用于 sort

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
a.reverse()
print(a)
a.sort()
print(a)

#+RESULTS:
: [0, 9, 8, 7, 6, 5, 4, 3, 2, 1]
: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

话说 org-mode显示的挺好的,到了markdownresult就不显示了

使用python脚本恢复原md文件

Posted in 2016-7-28 23:56 | Category: Python | Tags: pelican python

首先,这个恢复不是从磁盘中恢复,而是从数据库中恢复

原因呢,不久前我的博客md文件被我不小心删了, 而我的博客分静态博客(基于pelican),和我自己写的动态博客(需数据库),静态博客需要md文件, 不过还好,我的数据库一直有备份,所以直接从数据库中恢复

直接给出代码

import psycopg2
import os

conn = psycopg2.connect(database="blog",
                        user="postgres",
                        password="Your password",
                        host="127.0.0.1",
                        port="5432")
cur = conn.cursor()
cur.execute('select id,title,publish,author,category,content from articles')
articles = cur.fetchall()
print(len(articles))
for article in articles:
    cur.execute("select a.title,t.name from articles as a,tags as t, \
    tag_article as tt where  \
    tt.tags_id = t.id and tt.articles_id = a.id and a.id = %d" %
                article[0])
    tags = cur.fetchall()
    tags = ','.join(tag[1] for tag in tags)

    filename = os.path.join('markdown/', '%s.md' % article[1])
    title = (
        'Title: %s\nAuthor: %s\nDate: %s\nCategory: %s\nTags: %s\nSlug: %s\nSummary: %s\n …

如何安装及使用Honmaple社区程序

Posted in 2016-7-25 12:38 | Category: 生活随笔 | Tags: flask python

如何安装及使用

安装需要的package

pip install -r requirements.txt

配置config

查看配置详细介绍

注释下面代码

因为如果不注释的话 初始化数据库 会报错

文件位置: maple/topic/forms.py

category = SelectField(
    _('Category:'),
    choices=[(b.id, b.board + '   --' + b.parent_board)
             for b in Board.query.all()],
    coerce=int)

初始化数据库

python manage.py db init
python manage.py db migrate -m "first migrate"
python manage.py db upgrade

ok,将第三步中注释的内容恢复

创建管理员账户

python manager.py create_user

本地搭建


登陆并进入后台

python manager.py runserver

Visit http://forums.localhost:5000/admin

服务端搭建


参考 http://flask.pocoo.org/docs/0.11/deploying/

以我的配置为例:

配置nginx

server {
    listen …

centos7安装python3及pip3

Posted in 2016-7-7 9:32 | Category: Linux | Tags: pip python

安装python3

安装python3很简单

  • 下载源码并且编译
  • 安装epel

这里采用第二种方法:

yum install epel-release

安装完成之后,yum list python3* ,你就可以看见 python34

yum install python34

安装pip3

参考问题
如果在上述安装 python3时采用了第二种方法,pip默认未安装,而且无法通过yum install python34-pip来安装

正确的方法应该是:

yum install python34-setuptools
easy_install-3.4 pip # 这里可能有一些出入,总之是使用python3的easy_install

ok,就这样