资讯专栏INFORMATION COLUMN

mdwiki开发之路二资源与踩坑记录

molyzzx / 1889人阅读

摘要:侧边栏选用提到的。将改成来访问的形式组织代码出现循环的问题往往意味着代码的布局有问题,可以合并或者分离竞争资源。分离的话就是把需要的资源提取到一个第三方文件去。总之就是将循环变成单向。对于周期性任务缺一不可。其他任务可仅运行。

1、bootstrap代码片段:

如果你没有艺术细胞,偷懒的方法就是到这上面去找,比如登录框界面等。
侧边栏选用:http://www.designerslib.com/b...提到的http://bootsnipp.com/fullscre...。
其他一些资源:
w3schools-howto
一个比较炫的html模板(虽然最后没有采用)
bootstrap主题

2、DIV的CSS height:100%无效的解决办法:

在css当中增加上:

</>复制代码

  1. html, body{ margin:0; height:100%; }
3、Alembic migration失败,Sqlite lack of ALTER support解决办法:

在env.py中设置render_as_batch=True

</>复制代码

  1. context.configure(
  2. connection=connection,
  3. target_metadata=target_metadata,
  4. render_as_batch=True
  5. )
4、markdown扩展:

http://pythonhosted.org/Markd...
比较有用的
Table of Contents(toc)、
CodeHilite(代码高亮)、
Meta-Data(文件前面可以添加元数据,比如标题,作者等)、
New Line to Break(换行即新行,而不是像原生markdown那样得换两行)、
Tables(表格插件)

5、关于Flask的:

Flask request,g,session的实现原理
深入 Flask 源码理解 Context
Flask Session超时设置
默认情况下,flask session在你关闭浏览器的时候失效。你可以通过设置permanent session来改变这一行为。

</>复制代码

  1. from datetime import timedelta
  2. from flask import session, app
  3. @app.before_request
  4. def make_session_permanent():
  5. session.permanent = True
  6. app.permanent_session_lifetime = timedelta(minutes=30)

默认情况下,permanent_session_lifetime是31天。

6、关于SQLAlchemy:

SQLAlchemy 使用经验
SqlAlchemy query many-to-many relationship

</>复制代码

  1. class Restaurant(db.Model):
  2. ...
  3. dishes = db.relationship("Dish", secondary=restaurant_dish,
  4. backref=db.backref("restaurants"))

然后检索所有的dishes for a restaurant, you can do:

</>复制代码

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

产生类似如下SQL语句:

</>复制代码

  1. SELECT dish.*
  2. FROM dish
  3. WHERE
  4. EXISTS (
  5. SELECT 1
  6. FROM restaurant_dish
  7. WHERE
  8. dish.id = restaurant_dish.dish_id
  9. AND EXISTS (
  10. SELECT 1
  11. FROM restaurant
  12. WHERE
  13. restaurant_dish.restaurant_id = restaurant.id
  14. AND restaurant.name = :name
  15. )
  16. )
7、解决循环import的问题思路

1.延迟导入(lazy import)
即把import语句写在方法或函数里面,将它的作用域限制在局部。
这种方法的缺点就是会有性能问题。
2.将from xxx import yyy改成import xxx;xxx.yyy来访问的形式
3.组织代码
出现循环import的问题往往意味着代码的布局有问题,可以合并或者分离竞争资源。合并的话就是都写到一个文件里面去。分离的话就是把需要import的资源提取到一个第三方文件去。总之就是 将循环变成单向。
具体解决方案后续文章再贴代码

8、关于Python的一些:

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

</>复制代码

  1. if "myVar" in locals():
  2. # myVar exists.

To check the existence of a global variable:

</>复制代码

  1. if "myVar" in globals():
  2. # myVar exists.

To check if an object has an attribute:

</>复制代码

  1. if hasattr(obj, "attr_name"):
  2. # obj.attr_name exists.
  3. if("attr_name" in dir(obj)):
  4. pass

还有一个不是很优雅地方案,通过捕获异常的方式:

</>复制代码

  1. try:
  2. myVar
  3. except NameError:
  4. myVar = None
  5. # Now you"re free to use myVar without Python complaining.
9、关于Git与Github

How do I delete a Git branch with TortoiseGit
为什么给GIT库打TAG不成功

如何修改github上仓库的项目语言?

项目放在github,是不是经常被识别为javascript项目?知乎这篇问答给出了答案。
问题原因:
github 是根据项目里文件数目最多的文件类型,识别项目类型.
解决办法:
项目根目录添加 .gitattributes 文件, 内容如下 :

</>复制代码

  1. *.js linguist-language=python

作用: 把项目里的 .js 文件, 识别成 python 语言.

10、关于IDE的:

Indexing excluded directories in PyCharm
pycharm convert tabs to spaces automatically

11、关于Celery的:

periodic task for celery sent but not executed
这个由于我没仔细看官方文档,搞了好久。Celery的周期性任务scheduler需要配置beat和运行beat进程,但是仅仅运行beat进程可以吗?不行!我就是这里被坑了。还得同时运行一个worker。也就是说beat和worker都需要通过命令行运行。对于周期性任务beat缺一不可。其他任务可仅运行worker。

12、在supervisor或gunicorn设置环境变量

如果采用gunicorn命令行的形式:-e选项

</>复制代码

  1. 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

</>复制代码

  1. import multiprocessing
  2. bind = "127.0.0.1:4000"
  3. workers = multiprocessing.cpu_count() * 2 + 1
  4. worker_class="gevent"
  5. proc_name = "mdwiki"
  6. user = "nginx"
  7. chdir="/opt/mdwiki"
  8. #daemon=False
  9. #group = "nginx"
  10. loglevel = "info"
  11. #errorlog = "/home/myproject/log/gunicorn.log"
  12. #accesslog=
  13. raw_env = [
  14. "aliyun_api_key=value",
  15. "aliyun_secret_key=value",
  16. "MAIL_PASSWORD=value",
  17. "SECRET_KEY=mysecretkey",
  18. ]
  19. #ssl
  20. #keyfile=
  21. #certfile=
  22. #ca_certs=

如果采用supervisor配置环境变量

</>复制代码

  1. [program:mdwiki]
  2. environment=SECRET_KEY=value,aliyun_api_key=value,aliyun_secret_key=value,MAIL_PASSWORD=value
  3. command=/usr/bin/gunicorn -n mdwiki -w 4 -b 127.0.0.1:4000 -k gevent app:app
  4. directory=/opt/mdwiki
  5. user=nginx
  6. autostart=true
  7. autorestart=true
  8. redirect_stderr=true

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38245.html

相关文章

  • mdwiki开发之路资源踩坑记录

    摘要:侧边栏选用提到的。将改成来访问的形式组织代码出现循环的问题往往意味着代码的布局有问题,可以合并或者分离竞争资源。分离的话就是把需要的资源提取到一个第三方文件去。总之就是将循环变成单向。对于周期性任务缺一不可。其他任务可仅运行。 1、bootstrap代码片段: 如果你没有艺术细胞,偷懒的方法就是到这上面去找,比如登录框界面等。侧边栏选用:http://www.designerslib....

    linkFly 评论0 收藏0
  • FE.WX-小程序“无聊广场”游戏前端性能优化踩坑攻略

    摘要:本文主要针对小程序无聊广场的前端开发内容做总结,记录常见的一些老生常谈的进阶手法,对小程序中的动画音频等踩坑做出解决方案。 背景 一个交互不复杂,对刷新频率和动画效果要求不高的小游戏,不需要使用canvas主导的解决方案,使用dom操作一样可以完成。节省了cocos creater的学习成本,值得一试。本文主要针对小程序无聊广场的前端开发内容做总结,记录常见的一些老生常谈的进阶手法,对...

    qpal 评论0 收藏0
  • mdwiki开发之路一技术选型

    摘要:是一款系统,可以作为个人或小型团队的知识库管理系统。再加上目前开始学习与爬虫。技术选型作为新手,义不容辞为什么就为了原生支持开玩笑因为代表了的未来,而且越来越多的库已经迁移到了,没有什么理由不选择它。 mdwiki是一款markdown wiki系统,可以作为个人或小型团队的知识库管理系统。项目地址:本系列文章最后一篇给出(需要时间整理和测试) 为什么我要开发mdwiki? 目前本人的...

    pubdreamcc 评论0 收藏0
  • mdwiki开发之路一技术选型

    摘要:是一款系统,可以作为个人或小型团队的知识库管理系统。再加上目前开始学习与爬虫。技术选型作为新手,义不容辞为什么就为了原生支持开玩笑因为代表了的未来,而且越来越多的库已经迁移到了,没有什么理由不选择它。 mdwiki是一款markdown wiki系统,可以作为个人或小型团队的知识库管理系统。项目地址:本系列文章最后一篇给出(需要时间整理和测试) 为什么我要开发mdwiki? 目前本人的...

    李昌杰 评论0 收藏0
  • mdwiki开发之路

    摘要:写不下去了,直接贴地址吧。菜鸟第一个项目,求轻喷。后续打算变为采用来管理。加入图片和文章爬虫功能。 写不下去了,直接贴地址吧。菜鸟第一个python项目,求轻喷。后续打算变client-side session为server-side session,采用redis来管理session。加入图片和文章爬虫功能。重构代码。 项目地址:https://github.com/xbynet/m...

    fanux 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<