Python Challenge是一个过关式的解谜站点,使用的是经典在线解谜站点Not Pr0n的模式:根据提示找出下一关的网页地址。和Not Pr0n不同的是,在每一关里你都需要编写程序来寻找答案。虽然这个解谜站点的名字叫做Python Challenge,但事实上你可以使用任意一种程序语言(除了少数一两关可能会用到点Python的知识),Python Challenge的创始人是Nadav Samet。
Python Challenge是一个过关式的解谜站点,使用的是经典在线解谜站点Not Pr0n的模式:根据提示找出下一关的网页地址。和Not Pr0n不同的是,在每一关里你都需要编写程序来寻找答案。虽然这个解谜站点的名字叫做Python Challenge,但事实上你可以使用任意一种程序语言(除了少数一两关可能会用到点Python的知识),Python Challenge的创始人是Nadav Samet。
这一部分主要对博客的源代码进行就解析,会分三次完成。首先看看代码主要有config.py,model.py,views.py,myapp.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'])
配置文件里面主要设置了每页的文章数,数据库的相关信息:用户名、密码、地址、数据库名称,密钥,管理页面的用户名和密码,图片上传路径,允许的图片类型。
这里面的代码比较简单,主要是导入相应的模块,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)
上一部分介绍了博客整个结构,这一部分主要介绍templates与static两大文件夹里面的内容。
首先来看下templates 的内容:
这是整个博客的所有的页面:
static文件夹内容:
css:包含页面所有的css
images:页面的所有使用的图片
js:页面所使用的js
kindeditor:富媒体文本编辑器的代码地址
upload:博客上传的图片的文件夹
这是这两大文件夹里面的内容,下一部分针对所有源码就行解析!
代码地址:https://github.com/sixu05202004/flaskblog
项目是用于简单的个人博客,前端界面主要是拷贝了wordpress的主题:NeoEase
templates里面包含了很多网页模板:首页,文章页,标签页,分类页,搜索页等等,views.py包含很多的试图函数,config.py里面提供了一些基本的配置,model.py提供了基本的数据模型以及一些数据查询和处理的函数。
下一部分将会对源代码进行解析。
有时我们会想调试一个正在运行的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)
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上搭建测试环境时候,遇到需要升级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,保存修改即可