python challenge 介绍




Python Challenge是一个过关式的解谜站点,使用的是经典在线解谜站点Not Pr0n的模式:根据提示找出下一关的网页地址。和Not Pr0n不同的是,在每一关里你都需要编写程序来寻找答案。虽然这个解谜站点的名字叫做Python Challenge,但事实上你可以使用任意一种程序语言(除了少数一两关可能会用到点Python的知识),Python Challenge的创始人是Nadav Samet。

阅读全文 »

FLASK开源项目--派生吧博客推介之五

数据库的部分已经介绍完成,现在介绍了最后一部分:视图函数。 对于博客而言,视图函数需要完成的是:首页,文章页,分类页,标签页,搜索页,错误页面,关于页面。 错误页面 这个部分代码十分简单,直接返回404的模板。 @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 @app.route('/error/404') def error_404(): return render_template('404.html'), 404 关于页面 直接返回about页面的模板,直接需要额外处理页面的侧边栏,这个时候需要传一些参数:所有的分类,热门文章,最新文章,随机便签,最新评论。 @app.route('/about') def about(): categorys = Category.query.getall() #所有的分类 hot = Post.query.hottest()[:20] #热门文章,20个 new = Post.query.newpost()[:20] #最新文章,20个 tag = Tag.query.getall() shuffle(tag) tag = tag[:20] #标签云,20个 comments = Comment.query.newcomment()[:20] #最新评论,20个 return render_template('/about.html', categorys=categorys, hotarticles=hot, newpost=new, tags=tag, comments=comments) 首页 对于首页需要关注的是分页的情况,幸好, flask-sqlalchemy 提供了相应的处理函数,这里需要处理的提供当前页面,最后页数的参数到模板中。 @app.route('/') @app.route('/page/') def index(pageid=1): categorys = Category.query.getall() p = Post.query.getpost_perpage(pageid, per_page) hot = Post.query.hottest()[:20] new = Post.query.newpost()[:20] tag = Tag.query.getall() shuffle(tag) tag = tag[:20] comments = Comment.query.newcomment()[:20] articles = p.items if not p.total: pagination = [0] elif p.total % per_page: pagination = range(1, p.total / per_page + 2) else: pagination = range(1, p.total / per_page + 1) return render_template('/index.html', categorys=categorys, articles=articles, hotarticles=hot, newpost=new, tags=tag, comments=comments, pageid=pageid, pagination=pagination[pageid - 1:pageid + 10], last_page=pagination[-1], nav_current="index" ) 标签,分类页面 这个其实跟首页雷同,只是需要提供的文章内容不同。代码就略了。 搜索页面 对于搜索页面,我们需要获取请求的搜索关键词,然后调用数据库的查询函数,传入关键字就行。 @app.route('/search') @app.route('/search/page/') def search(pageid=1): categorys = Category.query.getall() hot = Post.query.hottest()[:20] new = Post.query.newpost()[:20] tag = Tag.query.getall() shuffle(tag) tag = tag[:20] comments = Comment.query.newcomment()[:20] searchword = request.args.get('s', '') if not searchword: return redirect(url_for('error_404')) searchresult = Post.query.search(searchword) p = pageby(searchresult, pageid, per_page, Post.post_create_time.desc()) articles = p.items if not p.total: pagination = [0] elif p.total % per_page: pagination = range(1, p.total / per_page + 2) else: pagination = range(1, p.total / per_page + 1) return render_template('/search.html', key=searchword, categorys=categorys, articles=articles, hotarticles=hot, newpost=new, tags=tag, comments=comments, pageid=pageid, pagination=pagination[pageid - 1:pageid + 10], last_page=pagination[-1] ) 文章页 对于文章页面,只需要传入指定的文章内容就行了,侧边栏跟首页的处理方式一样。 @app.route('/article/') def article(postid=5): categorys = Category.query.getall() hot = Post.query.hottest()[:20] new = Post.query.newpost()[:20] tag = Tag.query.getall() shuffle(tag) tag = tag[:20] comments = Comment.query.newcomment()[:20] articles = Post.query.getall() shuffle(articles) articles = articles[:5] post = Post.query.getpost_id(postid) if not post: return redirect(url_for('error_40 ...

阅读全文 »

FLASK开源项目--派生吧博客推介之四

这一部分主要介绍博客的数据库以及定义的常用的查询函数,这一部分代码主要在model.py里面。博客的数据库主要包含category,tag,tags,post,comment五张表。现在分别对这五张表以及相关的查询函数进行解析: category category(分类表),主要储存了博客的分类,表项只有id(自增)以及name(唯一). class Category(db.Model): __tablename__ = 'category' #表名 query_class = CategoryQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id category_name = db.Column(db.String(200), unique=True) #name #下面的内容可以自由选择 def __init__(self, category_name): self.category_name = category_name def __repr__(self): return ' ' % self.category_name 查询只要定义了两个函数getall以及getcategory_id:getall()获取所有的分类,getcategory_id(id)获取指定id 的分类。 class CategoryQuery(BaseQuery): def getall(self): return self.all() def getcategory_id(self, id): return self.get(id) tags tags(文章标签映射表),主要存储了文章id与标签的id的对应关系,存储文章的时候,该表会自动进行更新。 article_tags = db.Table('tags', db.Column( 'tag_id', db.Integer, db.ForeignKey('tag.id')), db.Column( 'post_id', db.Integer, db.ForeignKey('post.id')), ) tag tag(标签表),主要存储了文章的标签,表只有id(自增)以及name。 class Tag(db.Model): __tablename__ = 'tag' #表名 query_class = TagQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id name = db.Column(db.String(50)) #name def __init__(self, name): self.name = name def __repr__(self): return ' ' % self.name 查询只要定义了两个函数getall以及gettag_id:getall()获取所有的标签,gettag_id(id)获取指定id 的标签。 class TagQuery(BaseQuery): def getall(self): return self.all() def gettag_id(self, id): return self.get(id) post post(文章表),主要存储了博客的文章内容以及相关的分类以及标签信息,表只有id(自增)、post_content、post_title、post_create_time、view_num、comment_count、status、author_id、post_modified_time、category_id、post_name、tags_name(id,文章内容,文章标题,文章创建时间,阅读次数,评论数量,文章状态,作者id,文章修改时间,分类id,网址的缩写名称,标签名称)。 class Post(db.Model): __tablename__ = 'post' #表名 query_class = PostQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id post_content = db.Column(db.Text) #文章内容 post_title = db.Column(db.String(100)) #文章标题 post_name = db.Column(db.String(200), unique=True) #文章的网址的缩写,主要用于文章的网址以便于SEO优化 post_create_time = db.Column(db.DateTime, default=datetime.utcnow) #文章创建时间 view_num = db.Column(db.Integer, default=0) #阅读次数 comment_count = db.Column(db.Integer, default=0) #评论次数 status = db.Column(db.Integer, default=1) #文章状态 author_id = db.Column(db.Integer, default=1) #作者id,默认是1 post_modified_time = db.Column(db.DateTime, default=datetime.utcnow) #文章的修改时间 category_id = db.Column(db.Integer, db.ForeignKey('category.id')) #类型id categorys = db.relationship('Category', backref=db.backref( 'posts', lazy='dynamic'), lazy='select') #定义与category表之间的关系 tags = db.relationship('Tag', secondary=article_tags, backref=db.backref('posts', lazy='dynamic')) #定义域tag表之间的关系 def __init__(self, tags, post_content, post_title, category_id, post_name, post_create_time=None, view_num=0, comment_count=0, status=1, author_id=1, post_modified_time=None): self.post_content = post_content self.post_title = post_title self.category_id = category_id self.post_name = post_name ...

阅读全文 »

FLASK开源项目--派生吧博客推介之三

这一部分主要对博客的源代码进行就解析,会分三次完成。首先看看代码主要有config.py,model.py,views.py,myapp.py这四个文件。


  • config.py


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

# configuration page num  每页的文章数

PER_PAGE = 10        

# configuration mysql

SQLALCHEMY_DATABASE_URI = "mysql://%s:%s@%s/%s"%('root','root','127.0.0.1','test')
# 密钥
SECRET_KEY = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
# 管理界面的用户名和密码
USERNAME = 'admin'
PASSWORD = 'admin'
# 图片上传路径
UPLOAD_FOLDER = '/static/upload/'
#允许的图片类型

ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

配置文件里面主要设置了每页的文章数,数据库的相关信息:用户名、密码、地址、数据库名称,密钥,管理页面的用户名和密码,图片上传路径,允许的图片类型。

  • myapp.py

这里面的代码比较简单,主要是导入相应的模块,app运行的端口以及debug模式:


from flask import Flask
app = Flask(__name__)
app.config.from_object('config')
from views import *

if __name__ == '__main__':
 app.run(host='0.0.0.0', debug=True)


阅读全文 »

flask开源项目--派生吧博客推介之二

上一部分介绍了博客整个结构,这一部分主要介绍templates与static两大文件夹里面的内容。

首先来看下templates 的内容:

这是整个博客的所有的页面:

  • 404.html:错误页面,里面嵌入了公益寻人的js代码;
  • about.html:个人说明页面
  • category.html:分类目录的页面
  • editpost.html:文章编辑的页面
  • error.html:错误页面,里面会显示具体的错误信息,用于给调试使用;
  • foot.html:所有页面的页脚部分
  • head.html:所有页面的头的部分
  • index.html:博客的首页
  • layout.hml:页面的通用结构
  • login.html:登录页面
  • newpost.html:编写新文章的页面
  • post.html:单页文章的页面
  • search.html:搜索结果的页面
  • sider.html:所有页面的侧边栏
  • tag.html:标签页面

static文件夹内容:

css:包含页面所有的css

images:页面的所有使用的图片

js:页面所使用的js

kindeditor:富媒体文本编辑器的代码地址

upload:博客上传的图片的文件夹

这是这两大文件夹里面的内容,下一部分针对所有源码就行解析!

阅读全文 »

flask开源项目--派生吧博客推介之一

项目简介:

网址:www.pythonpub.com

代码地址:https://github.com/sixu05202004/flaskblog

项目是用于简单的个人博客,前端界面主要是拷贝了wordpress的主题:NeoEase

项目使用的技术与插件:


  • flask_sqlalchemy:是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展。 它致力于简化在 Flask 中 SQLAlchemy 的 使用,提供了有用的默认值和额外的助手来更简单地完成日常任务。
  • flask_cache:缓存插件,可以用于提高网页的访问速度
  • Bootstrap:Twitter的著名的CSS/HTML框架
  • kindeditor:富文本编辑器


代码结构:

templates里面包含了很多网页模板:首页,文章页,标签页,分类页,搜索页等等,views.py包含很多的试图函数,config.py里面提供了一些基本的配置,model.py提供了基本的数据模型以及一些数据查询和处理的函数。

下一部分将会对源代码进行解析。


阅读全文 »

使用 gdb 调试 Python 进程

有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump。例如现在遇到一个mod_wsgi的进程僵死了,不接受 请求,想看看究竟是运行到哪行Python代码呢?这时就需要祭出gdb这个神器了。 准备 1. 确认你的gdb版本是>=7,gdb从版本7开始支持对Python的debug。 (ref)

2.确认gdb连接的Python是所要debug的Python,否则请重新编译gdb。

方法: $ gdb (gdb) python >import sys >print sys.version >end 2.4.3 (#1, Sep 21 2011, 19:55:41)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] 在一些追求稳定的发行版(例如CentOS),Python的版本会较低,这时都会自己编译一个Python使用。而从源里安装的gdb会连接源里 Python的版本。例如在CentOS 5.4,源里的Python是2.4.3,从源安装的gdb也会连接到Python 2.4.3。 编译时注意,要把自己编译的Python路径加到PATH环境变量里,这样gdb configure的时候才会找到新版Python并连接。

3.下载libpython.py

如何Debug 假设要debug的进程号为1000 $ gdb -p 1000 使用此命令即可使gdb附加到进程。

载入libpython脚本 如果你的gdb是redhat或fedora等厂商修改过的,会有--python选项,使用此选项即可指定gdb启动时载入的Python扩展脚本(此 脚本是扩展gdb的,不是我们需要debug的脚本)。

$ gdb --python /path/to/libpython.py -p 1000 如果安装的是GNU的gdb,就需要打开gdb后手动载入libpython.py脚本 (gdb) python >import sys >sys.path.insert(0, '/path/to/libpython.py') >import libpython >end (gdb) 这时就可以使用py-bt命令打印当前线程的Python traceback了

libpython还提供很多命令,例如py-print打印变量,py-locals打印所有本地变量等等,详细可打开libpython.py查看。 一点经验 在gdb可以使用generate-core-file命令生成一个coredump文件。之后可以用gdb –core来打开coredump文件进行debug。避免一直attach住进程,可以快速重启恢复服务 gdb-heap是gdb的一个扩展。可以打印Python的内存使用情况

参考资料 DebuggingWithGdb EasierPythonDebugging Debugging with gdb (gdb documentation)

阅读全文 »

Sieve of Eratosthenes算法的代码

In mathematics, the Sieve of Eratosthenes (Greek: κόσκινον Ἐρατοσθένους) is a simple, ancient algorithm for finding all prime numbers up to a specified integer.[1] It works efficiently for the smaller primes (below 10 million).[2] It was created by Eratosthenes, an ancient Greek mathematician. However, none of his mathematical works survived—the sieve was described and attributed to Eratosthenes in the Introduction to Arithmetic by Nicomachus. A prime number is a natural number which has exactly two distinct natural number divisors: 1 and itself. [素数的定义是,一个仅能被1和本身整除的自然数]

To find all the prime numbers less than or equal to a given integer n by Eratosthenes' method:

[可以通过以下的埃拉托色尼筛选法寻求所有小于整数n的素数]

Create a list of consecutive integers from two to n: (2, 3, 4, ..., n).

[列出从2到n的一串连续自然数]

Initially, let p equal 2, the first prime number.

[开始,先把2当作第一个素数,并赋值给变量p]

Strike from the list all multiples of p less than or equal to n. (2p, 3p, 4p, etc.)

[将该列自然数中划掉p的倍数]

Find the first number remaining on the list after p (this number is the next prime); replace p with this number.

[将剩下的自然数按原来顺序重新组成新的一列,并将第一个数赋给变量p]

Repeat steps 3 and 4 until p2 is greater than n.

[重复第三第四步,直到p的平方大于n]

All the remaining numbers in the list are prime.

[剩下的自然数就是所有小于n的素数]

import math

limit=1000000000

L=[True]*limit

def seive(x):

    for i in xrange(x*2,limit,x):

        L[i]=False map(seive,[2])

map(seive,xrange(3,int(math.ceil(math.sqrt(limit))),2))

primer=[]

for i in xrange(2,limit):

    if L[i]: primer.append(i)

print primer

阅读全文 »

CentOS 5升级python版本(2.4>2.7)

日前在CentOS上搭建测试环境时候,遇到需要升级python版本的情况,于是就记录了整个升级的过程:

     在CentOS5中自带的Python版本是2.4,但是目前许多基于Python的应用软件要求的Python版本应要高于2.4。升级python版 本的时候千万不能卸载python 2.4,再安装python2.7,这样会有无穷无尽的麻烦,保守的方式是直接安装python2.7的源码包,也就是python两个版本共存。(因为 Centos里面有很多程序是依赖着python,所有最好不要尝试去卸载python2.4)。

(1)下载/安装python

下载Python2.7.2.tar.bz2(http://www.python.org/ftp/python/2.7.2/Python- 2.7.2.tar.bz2)

$tar jxvf Python2.7.2.tar.bz2 $cd Python2.7.2

$./configure $make && make install 自此,python2.7安装后路径默认是在/usr/local/lib/python2.7 查看Python版本: $ /usr/local/bin/python2.7 -V

(2)建立软连接,使系统默认的python指向python2.7

正常情况下即使python2.7安装成功后,系统默认指向的python仍然是2.4版本,考虑到yum是基于python2.4才能正常工作,不敢轻 易卸载。如何实现将系统默认的python指向到2.7版本呢?

mv /usr/bin/python /usr/bin/python.bak (或者rm -rf /usr/bin/python)

ln -s /usr/local/bin/python2.7 /usr/bin/python

检验python指向是否成功 python -V

(3) 解决系统python软链接指向python2.7版本后,yum不能正常工作 方法:

$vi /usr/bin/yum 将文本编辑显示的#/usr/bin/python修改为#/usr/bin/python2.4,保存修改即可

阅读全文 »