基于restful的flask权限管理


为什么需要restful形式的权限管理

最近在写flask应用时使用了 restful 形式的flask.views.MethodView,但是在对其进行权限管理时遇到了一些问题

flask文档上介绍说用

decorators = []

添加装饰器,但实际使用上,比如

  • getpost 采用不同的权限

get 不使用 login_required
post 需要 login_required

这样就不能使用 decorators 对视图进行装饰

  • post ,delete, put 都需要 login_required,但是get不需要 而 delete 又需要更高级别的权限,我们可以这样

    class AAA(MethodView):
    
        def get(self,uid):
            ...
    
        @login_required
        def post(self):
            ...
    
        @login_required
        def put(self,uid):
            ...
    
        @login_required
        @more_required
        def delete(self,uid):
            ...
    

    是不是看起来还不错, 但是,如果再加上类似EditBlogPostPermission …

flask日志处理


使用文档上的一句话:

Applications fail, servers fail. Sooner or later you will see an exception in production. Even if your code is 100% correct, you will still see exceptions from time to time. Why? Because everything else involved will fail.

应用发生错误时发送邮件

这里文档上个人认为说的不清不楚,毕竟想要使用还要看logging的文档

原文档

ADMINS = ['[email protected]']
if not app.debug:
    import logging
    from logging.handlers import SMTPHandler
    mail_handler = SMTPHandler('127.0.0.1' …

flask中生成atom


参考资料1 参考资料2

下面是具体代码
# from urlparse import urljoin #python2
from urllib.parse import urljoin
from flask import request
from werkzeug.contrib.atom import AtomFeed


def make_external(url):
    return urljoin(request.url_root, url)


@site.route('/atom.xml')
def feed():
    feed = AtomFeed('Recent Articles',
                    feed_url=request.url,
                    url=request.url_root,
                    subtitle='I like solitude, yearning for freedom')
    articles = Articles.query.limit(15).all()
    for article in articles …

flask实现分页


数据库实现分页

offset

使用offset可以实现数据库分页功能

questions = Questions.query.offset(num) # 从num开始

limit

使用limit实现限制每页的文章数量

questions = Questions.query.offset(num).limit(6) #每页显示6篇文章

前端实现分页

需求设计

是使用上一页,下一页,用表单进行跳转,还是使用数字显示

获得文章数量 pages,和当前页码 number

简单的上一页,下一页

因为我的设计不是这个,所以简单说一下

下一页,上一页

jinja2 代码

<a href="{{ url_for('blog.index',number=number + 1)}}">下一页</a>
<a href="{{ url_for('blog.index',number=number - 1)}}">下一页</a>

首页没有上一页,尾页没有下一页

{% if number == pages %}
no next …

sqlalchemy学习(一)


sqlalchemy

系统的学一下sqlalchemyA,不过没有中文文档,只能用我的渣英文能力慢慢看原文档了

数据库连接

>>> from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:', echo=True)

echo为True输出日志

各种数据库连接方式

dialect+driver://username:password@host:port/database
  1. Postgresql

    # default
    engine = create_engine('postgresql://scott:tiger@localhost/mydatabase')
    # psycopg2
    engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase')
    # pg8000
    engine = create_engine('postgresql+pg8000://scott:tiger@localhost/mydatabase')
    
  2. MySQL

    # default
    engine = create_engine('mysql://scott:tiger@localhost/foo')
    # mysql-python
    engine = create_engine('mysql …

python一些加密解密


import hashlib
import base64

data = '123456'
data = data.encode('utf-8')
md5 = hashlib.md5()
md5.update(data)
print ("md5加密 :%s"%md5.hexdigest())
sha1 = hashlib.sha1()
sha1.update(data)
print ("sha1加密: %s"%sha1.hexdigest())
sha224 = hashlib.sha224()
sha224.update(data)
print ("sha224加密: %s"%sha224.hexdigest())
sha256 = hashlib.sha256()
sha256.update(data)
print ("sha256加密: %s"%sha256.hexdigest())
sha384 = hashlib.sha384()
sha384.update(data)
print ("sha384加密: %s"%sha384 …

python时间转换


>>> import datetime

string转datetime

>>> import datetime
>>> str = "2016-04-03"
>>> date_time = datetime.datetime.strptime(str,'%Y-%m-%d')
>>> date_time
datetime.datetime(2016, 4, 3, 0, 0)

datetime转string

>>> date_time.strftime('%Y-%m-%d')
'2016-04-03'

datetime转时间戳

>>> time_time = time.mktime(date_time.timetuple())
>>> time_time
1459612800.0

时间戳转string

>>> time.strftime('%Y-%m-%d',time.localtime(time_time))
'2016-04-03'

母羊生羊问题解决


问题是这样的: 1只母羊,在第2年和第4年生下小母羊,在第5年死去,问N年后有多少母羊?

想了很久,终于有了一个思路,不过目前效率不高

给出代码:

a = [1]
def sheep(N):
    N = int(N)
    if N == 1:
        return a
    for n,k in enumerate(a):
        a[n] += 1
    for n,k in enumerate(a):
        if k == 2:
            a.append(1)
        if k == 4:
            a.append(1)
    return sheep(N-1)

while True:
    b = sheep(input('请输入年份:\n'))
    c = [i for i in …

python复习(二)


map

map()函数接收两个参数,一个是函数,一个是Iterable, map将传入的函数依次作用到序列的每个元素, 并把结果作为新的Iterator返回。

>>> def f(x):
...     return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

或者

>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

reduce

reduce把一个函数作用在一个序列[x1, x2, x3, ...]上 …