mdwiki開發之路二資源與踩坑記錄

一、bootstrap代碼片斷

若是你沒有藝術細胞,偷懶的方法就是到這上面去找,好比登陸框界面等。
側邊欄選用:http://www.designerslib.com/b...提到的http://bootsnipp.com/fullscre...
其餘一些資源:
w3schools-howto
一個比較炫的html模板(雖然最後沒有采用)
bootstrap主題javascript

二、DIV的CSS height:100%無效的解決辦法:

在css當中增長上:css

html, body{ margin:0; height:100%; }

三、Alembic migration失敗,Sqlite lack of ALTER support解決辦法:

在env.py中設置render_as_batch=Truehtml

context.configure(
    connection=connection,
    target_metadata=target_metadata,
    render_as_batch=True
)

四、markdown擴展:

http://pythonhosted.org/Markd...
比較有用的
Table of Contents(toc)、
CodeHilite(代碼高亮)、
Meta-Data(文件前面能夠添加元數據,好比標題,做者等)、
New Line to Break(換行即新行,而不是像原生markdown那樣得換兩行)、
Tables(表格插件)java

五、關於Flask的:

Flask request,g,session的實現原理
深刻 Flask 源碼理解 Context
Flask Session超時設置
默認狀況下,flask session在你關閉瀏覽器的時候失效。你能夠經過設置permanent session來改變這一行爲。python

from datetime import timedelta
from flask import session, app

@app.before_request
def make_session_permanent():
    session.permanent = True
    app.permanent_session_lifetime = timedelta(minutes=30)

默認狀況下,permanent_session_lifetime是31天。nginx

六、關於SQLAlchemy:

SQLAlchemy 使用經驗
SqlAlchemy query many-to-many relationshipgit

class Restaurant(db.Model):
    ...

    dishes = db.relationship('Dish', secondary=restaurant_dish,
        backref=db.backref('restaurants'))

而後檢索全部的dishes for a restaurant, you can do:github

x = Dish.query.filter(Dish.restaurants.any(name=name)).all()

產生相似以下SQL語句:sql

SELECT dish.*
FROM dish
WHERE
    EXISTS (
        SELECT 1
        FROM restaurant_dish
        WHERE
            dish.id = restaurant_dish.dish_id
            AND EXISTS (
                SELECT 1
                FROM restaurant
                WHERE
                    restaurant_dish.restaurant_id = restaurant.id
                    AND restaurant.name = :name
            )
    )

七、解決循環import的問題思路

1.延遲導入(lazy import)
即把import語句寫在方法或函數裏面,將它的做用域限制在局部。
這種方法的缺點就是會有性能問題。
2.將from xxx import yyy改爲import xxx;xxx.yyy來訪問的形式
3.組織代碼
出現循環import的問題每每意味着代碼的佈局有問題,能夠合併或者分離競爭資源。合併的話就是都寫到一個文件裏面去。分離的話就是把須要import的資源提取到一個第三方文件去。總之就是 將循環變成單向。
具體解決方案後續文章再貼代碼django

八、關於Python的一些:

Good logging practice in Python
How do I check if a variable exists?
To check the existence of a local variable:

if 'myVar' in locals():
  # myVar exists.

To check the existence of a global variable:

if 'myVar' in globals():
  # myVar exists.

To check if an object has an attribute:

if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.
if('attr_name' in dir(obj)):
    pass

還有一個不是很優雅地方案,經過捕獲異常的方式:

try:
    myVar
except NameError:
    myVar = None
# Now you're free to use myVar without Python complaining.

九、關於Git與Github

How do I delete a Git branch with TortoiseGit
爲何給GIT庫打TAG不成功

如何修改github上倉庫的項目語言?

項目放在github,是否是常常被識別爲javascript項目?知乎這篇問答給出了答案。
問題緣由:
github 是根據項目裏文件數目最多的文件類型,識別項目類型.
解決辦法:
項目根目錄添加 .gitattributes 文件, 內容以下 :

*.js linguist-language=python

做用: 把項目裏的 .js 文件, 識別成 python 語言.

十、關於IDE的:

Indexing excluded directories in PyCharm
pycharm convert tabs to spaces automatically

十一、關於Celery的:

periodic task for celery sent but not executed
這個因爲我沒仔細看官方文檔,搞了很久。Celery的週期性任務scheduler須要配置beat和運行beat進程,可是僅僅運行beat進程能夠嗎?不行!我就是這裏被坑了。還得同時運行一個worker。也就是說beat和worker都須要經過命令行運行。對於週期性任務beat缺一不可。其餘任務可僅運行worker。

十二、在supervisor或gunicorn設置環境變量

若是採用gunicorn命令行的形式:-e選項

gunicorn -w 4 -b 127.0.0.1:4000 -k gevent -e aliyun_api_key=value,SECRET_KEY=mysecretkey app:app

若是採用gunicorn.conf.py文件的形式:raw_env

import multiprocessing

bind = "127.0.0.1:4000"
workers = multiprocessing.cpu_count() * 2 + 1
worker_class='gevent'
proc_name = "mdwiki"
user = "nginx"
chdir='/opt/mdwiki'
#daemon=False
#group = "nginx"
loglevel = "info"
#errorlog = "/home/myproject/log/gunicorn.log"
#accesslog=
raw_env = [
   'aliyun_api_key=value',
   'aliyun_secret_key=value',
   'MAIL_PASSWORD=value',
   'SECRET_KEY=mysecretkey',
]
#ssl
#keyfile=
#certfile=
#ca_certs=

若是採用supervisor配置環境變量

[program:mdwiki]
environment=SECRET_KEY=value,aliyun_api_key=value,aliyun_secret_key=value,MAIL_PASSWORD=value
command=/usr/bin/gunicorn -n mdwiki -w 4 -b 127.0.0.1:4000 -k gevent app:app 
directory=/opt/mdwiki
user=nginx
autostart=true
autorestart=true
redirect_stderr=true
相關文章
相關標籤/搜索