Giter Site home page Giter Site logo

my_blog's Introduction

这篇文章将简单地描述一下博客的搭建过程。博客源代码见这里
首先要感谢stevelosh, 博客的基本设计参考了他的博客,来源于stevelosh.com 这篇文章。
博客从2013.8开始搭建,暑假主要处于学习阶段,学期途中插空写了一点,2014寒假把基本框架完成了。
对于想基于代码学习/搭建博客的行为,本人不能够更欢迎,但是请至少做到:
在运行之前修改settings.py,再不济,请至少把这里的email替换成你自己的email

ADMINS = (
    # ('Your Name', '[email protected]'),
    ('laike9m', '[email protected]'),
)

否则,你的代码运行时的出错信息将被发送到我的邮箱,不利于你进行调试,也给我带来极大困扰。不胜感激!!

之前忘记提到,由于我一开始就使用 Py3,所以代码在很多地方都是 Py2 不兼容的,比如某位 fork 了代码的同学发现不能成功创建文章。排查了一下错误,发现是因为My_Blog/css3two_blog/models.py中有这么一段代码:

if type(self.body) == bytes:  # sometimes body is str sometimes bytes...
     data = self.body
elif type(self.body) == str:
     data = self.body.encode('utf-8')

在 Py3里面,这么写就 cover 了self.body的所有可能情况, data 肯定会被赋值。但是那位同学发现data最后是未定义的,为什么呢?因为他用的是 Py2,所以bodyunicode,自然不行。
所以建议是,直接采用 Py3 来运行我的 blog,或者 fork 一份然后做一些 Py2 compatible 的修改(我也不知道哪些地方要改)。

设计

在博客搭建之初,我就决定要尽可能少写前端代码。最简单的方法自然是使用CMS。实际上有不少使用Django的CMS,比如最著名的django CMS。不过调研一番之后发现一个问题:没有一个支持Python 3。考虑到博客里必然有一堆Unicode字符,我还是希望能用Python 3的,所以就放弃了CMS。
(2014.6.25 EDIT: 目前发现django CMS已经能支持Python3.4了,至少3.0.2版本以及更新的都可以。参见3.0.2 release
好在马上找到了替代品:HTML模版。最后使用了css3templates 里面的一个模板。模板基本只包含HTML/CSS/JS代码,这正是我需要的东西,因为后端本来就是想从零开始写的。

文件路径结构

用Django建网站,staticmedia 到底怎么放置?这个问题没有标准答案,反正我没有用 STATICFILES_DIRS,也就是把所有static files都放在了appname/static/appname 里面。这样的好处是文件结构比较清晰,坏处是如果app多了同样的文件可能要存很多份,会减慢网站加载速度。下面是我的文件夹结构,供参考,文件均未列出:

my_blog
├─media
│  ├─content
│  │  └─BlogPost
│  │      ├─2009
│  │      ├─2013
│  │      ├─2014
│  │      └─images
│  └─files
├─My_Blog
│  ├─css3two_blog
│  │  ├─migrations
│  │  ├─static
│  │  │  └─css3two_blog
│  │  │      ├─documentation
│  │  │      ├─fonts
│  │  │      ├─images
│  │  │      └─js
│  │  └─templates
│  │    └─css3two_blog
│  ├─mytemplatetags
│  │  └─templatetags
│  ├─my_blog
│  └─templates
│      └─admin
└─static
    ├─admin
    │  ├─css
    │  ├─img
    │  │  └─gis
    │  └─js
    │     └─admin
    └─css3two_blog
        ├─documentation
        ├─fonts
        ├─images
        └─js

画这个东西的时候才知道Windows/Linux下有个命令叫 [tree][tree],大好评!
注意在开发的时候,my_blog/static 里面可以不放东西,只要 DEBUG=True 就行。如果要接受文件上传,那么在 urlpatterns 后面添加:

+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

实际部署时该怎么来就怎么来。
有一个 app 叫做 mytemplatetags,它是专门用来装 custom template tags/filters 的,参见 [官方文档:Custom template tags and filters][customtag]. [tree]:http://stackoverflow.com/questions/347551/what-tool-to-use-to-draw-file-tree-diagram [customtag]:https://docs.djangoproject.com/en/1.6/howto/custom-template-tags/

主机

在哪里买主机是个需要好好思考的问题。使用VPS的话,可选择的范围很大。但是第一次建网站,没什么经验,怕配置不好。更重要的是用VPS不够短平快,而我希望博客能尽快投入使用。然后就查到了WebFaction。虽然我并不想做广告,但真的向大家推荐这个主机服务,尤其是怕麻烦的人。Webfaction是个PaaS服务,支持许多语言/框架,而且服务很完善,不论是在它的 Q&A Community 提问还是open a ticket,工作人员的解答都很迅速。虽然是美国的主机(也可以选东南亚的),但是国内访问速度不错。至于其它选择,外国人用 heroku 的比较多。国内主机不太了解,SAE 据说不错。 (UPDATE: 现在我已经用了两年多 DigitalOcean,感觉还是非常不错的,参见《决定转投 DigitalOcean》)

版本控制

显然是Git+Github,没什么好说的。印象深刻的是有一次在主机上玩火敲了这个命令 find . -not -name 'xxx' | xargs rm,结果大家都懂。还好WebFaction重建一个Django app就是点击几下的事情,代码又在Github上,所以很容易就恢复了。
还有,settings.py 这个文件最好ignore掉,因为部署和开发在设置上差异很大,所以这个文件在本地和服务器上需要保存不同的版本。顺便分享一下 .gitignore 吧:

.pydevproject
.project
.settings/*
db.sqlite3
css3two_blog/migrations/*
css3two_blog/static/css3two_blog/css/unused/*
*.pyc

为什么settings.py没有包含在内呢?这个问题比较复杂,在我的另一篇文章 [Django Best Practice: How to deal with settings.py in Git][settings] 里面有详细讲述。 [settings]:http://www.laike9m.com/blog/django-best-practice-how-to-deal-with-settingspy-in-git,27/

使用Markdown

这是跟stevelosh学的,而且似乎越来越多的个人博客都在这么做。我的每一篇文章都是用markdown写的,然后渲染成html。关于如何渲染有不同的做法,一开始尝试了pygments + django markup,虽然可以实现代码高亮不过样式比较难看。目前采用的方法是把markdown文本发送给Github API,得到 gfm 格式的html。需要注意的是得到的 html 是没有样式的,所以又在网上找了别人写的 gfm 的 css,添加到页面里,显示出来的页面就和 Github 的 README 差不多了。
这部分的工作有一定难度,需要设计出一套 markdown 和 html 文件的保存机制,并且能正常应对 admin 界面中的修改/删除操作。具体可见 models.pyadmin.py

其它

  1. 使用 south 来应对 Model 的变更
  2. 尽量把逻辑放在 modelsviews 来完成,因为Django的 templates 实在很难用
  3. 虽然用了 HTML 模版,但是在前端仍然花了很多时间
  4. 博客完全可以用 Hyde 搭建,这样加载起来能快一些

> 初版:2014-2-5 > EDIT:2014-2-20 加入**文件路径结构**小节,增补其它小节内容 > EDIT:2014-6-25 django CMS 已经支持 Python3.4 > EDIT:2014-8-29 强调了博客只支持 Py3

my_blog's People

Contributors

dependabot[bot] avatar laike9m avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

my_blog's Issues

Problems to start the blog

Hi, laike9m

Recently, I have tested your blog on my computer and I want to study Django by some examples. I downloaded your source code on test on win7. The following is the step I adopt:

First, I use the virtualenv to build a virtual env:

virtualenv env

Second I go to the Scripts to run the activate:

D:\python\web\blog\Scripts>activate

Then I copy your source code to the Scripts dir. I install the requirement by running the following command:

python install -r requirements.txt

After doing this, I modified the choose_settings.py such as the node, then I run the following command:

python manage.py runserver

It doesn't work. Besides the following

└─static
├─admin
│ ├─css
│ ├─img
│ │ └─gis
│ └─js
│ └─admin
└─css3two_blog
├─documentation
├─fonts
├─images
└─js
seems you forgot to provides. Would you help to debug it successfully on my local computer.

Looking forward to your reply. Thanks.

DB

试着跑了下,似乎提供的测试DB结构不对,没有配置完全,css3two_blog_blogpost这个表没有配置,也没有自动创建

Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x000001DB1D7557

E:\myblog>python manage.py runserver
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x000001DB1D7557B8>
Traceback (most recent call last):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\utils\autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\management\commands\runserver.py", line 113, in inner_run
    autoreload.raise_last_exception()
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\utils\autoreload.py", line 249, in raise_last_exception
    six.reraise(*_exception)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\utils\six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\utils\autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\apps\registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\apps\config.py", line 90, in create
    module = import_module(entry)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named 'mytemplatetags'
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x000001ED342667B8>
Traceback (most recent call last):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\utils\autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\management\commands\runserver.py", line 113, in inner_run
    autoreload.raise_last_exception()
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\utils\autoreload.py", line 249, in raise_last_exception
    six.reraise(*_exception)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\utils\six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\utils\autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\apps\registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages\django\apps\config.py", line 90, in create
    module = import_module(entry)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named 'mytemplatetags'`


出现原因:当我删掉mytemplatetags,也就是含有admin.html,base.html的那个。他就报错。
我一时也找不出错误,希望您有时间能帮帮我,不胜感激!  @@

在编辑blog的时候是否可以预览?

登入admin,post新blog编辑的时候,是否可以有格式的工具栏,或者预览。不然一片空白,很难控制格式,甚至插入图片什么的也很困难。

博主您好!

是这样的,本人刚开始学习django框架,然后看到博主的博客想学习一下就down到本地了,然后运行mange.py
'''python
mange.py runserver
'''
结果报错
‘’‘
C:\Python34\python.exe D:/My_Blog-master/manage.py
Traceback (most recent call last):
File "D:/My_Blog-master/manage.py", line 10, in
execute_from_command_line(sys.argv)
File "C:\Python34\lib\site-packages\django\core\management_init_.py", line 367, in execute_from_command_line
utility.execute()
File "C:\Python34\lib\site-packages\django\core\management_init_.py", line 316, in execute
settings.INSTALLED_APPS
File "C:\Python34\lib\site-packages\django\conf_init_.py", line 53, in getattr
self.setup(name)
File "C:\Python34\lib\site-packages\django\conf_init
.py", line 41, in setup
self.wrapped = Settings(settings_module)
File "C:\Python34\lib\site-packages\django\conf_init
.py", line 97, in init
mod = importlib.import_module(self.SETTINGS_MODULE)
File "C:\Python34\lib\importlib_init
.py", line 109, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 2254, in _gcd_import
File "", line 2237, in _find_and_load
File "", line 2226, in _find_and_load_unlocked
File "", line 1200, in _load_unlocked
File "", line 1129, in _exec
File "", line 1471, in exec_module
File "", line 321, in _call_with_frames_removed
File "D:\My_Blog-master\my_blog\settings.py", line 3, in
from . import choose_settings
File "D:\My_Blog-master\my_blog\choose_settings.py", line 33, in
'PASSWORD': os.environ["DJANGO_DB_PASSWORD"],
File "C:\Python34\lib\os.py", line 635, in getitem
raise KeyError(key) from None
KeyError: 'DJANGO_DB_PASSWORD'
‘’‘
不知道是因为什么。。。我的电脑是windows系统,python3.4的’

A question about how you deploy this project

laike9m 你好,我正在写一个 Django 的小项目,从你的博客中学到很多。关于部署有些不明白的地方,希望你能给我一些建议:

  1. Nginx + Gunicorn 好像是比较推荐的组合,是否应该再搭配 supervisor 来避免服务器宕机的影响?
  2. 关于文章备份,我目前的想法是先在本地写好,再上传。数据库备份就没那么方便了。想听下你的建议。
  3. 更新代码,直接利用 git 来更新是否可行呢?
    Thanks!

markdown 转换后的HTML渲染问题

model里是通过github来将markdown转换为HTML格式的,我有个疑问,转换后的HTML是否我可以随意找一个我喜欢的样式表来渲染,而不必用csstwoblog?thanks!

error occured when save blog

UnboundLocalError at /admin/css3two_blog/blogpost/add/

local variable 'data' referenced before assignment
My_Blog/css3two_blog/models.py in save, line 82

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.