django搭建blog

来源:互联网 发布:wampserver mac版 编辑:程序博客网 时间:2024/05/16 11:32

        虽然已经接触python好几个月了,但是始终没有用python开发过什么具体的应用。编程语言这东西本来就是一个应用的工具,不经常使用,很难有深刻的认识。之前一直在网络上看到对django的各种赞誉,而且早就下载了相关资料准备学习学习,但空有一颗上进的心却一直没有下定决心着手学习。国庆几天在家待着没什么事,终于下定决心要整django了。下面将通过实际操作,介绍一下如何使用django快速搭建一个blog。

        网络上的好多资料都是针对linux系统介绍django搭建的,而且django的版本也五花八门,而且搭建的方法也分为命令行搭建和IDE搭建两种。不同环境不同版本搭建django web服务的操作还是略有不同的。下面的步骤将附带介绍作者搭建过程中遇到的困难,以及最终的解决方法。现在的好多IDE,比如pycharm,功能相当强大。使用pycharm搭建django服务可以省去好多简单繁琐的操作。笔者下面的操作主要针对在win 8下使用pycharm搭建1.7版本的django服务。

创建项目

打开pycharm,选择“new project”,在出现的如下窗口中点击Django后面的箭头。在新的窗口中填写项目的名字,以及应用的名字,比如作者填写的应用名字为blog。然后点击create,创建一个 项目。








创建完成后,对应的路径下将创建许多文件,红框内的文件为后续添加,暂时不用理会






其中lsc_site文件夹(名字有工程名字相同)下的文件为项目配置相关的一些文件,blog文件夹(名字与应用名字相同)下的文件为应用相关的文件。templates文件夹存放视图的模板,manage.py为管理工程的文件,后续的使用频率相当高。注意,如果不是使用IDE创建的django工程,路径下的应用相关的文件夹,以及templates文件夹都需要自己手动创建。

在命令行窗口执行如下命令,验证工程是否创建成功,正常情况下会输出如下的提示信息。
D:\lsc\study\python code\lsc_site>python manage.py runserver # 注意执行命令的目录
Run 'python manage.py migrate' to apply them.October 04, 2015 - 12:10:14Django version 1.7.10, using settings 'lsc_site.settings'Starting development server at http://127.0.0.1:8000/Quit the server with CTRL-BREAK.

在浏览器中输入提示信息中的url,可以得到下面的网页




创建应用的模型

django的应用模型的作用是实现数据库与程序对象之间的交互,其本质为python中的ORM(对象关系映射)。创建应用的模型,只需要编辑blog文件夹下的“model.py”文件。在model.py文件中添加如下代码
from django.db import modelsclass BlogPost(models.Model):  # 应用的模型类为Model的子类,对应数据库中的一张表的模型    title = models.CharField(max_length=150) # 给表添加一个标题属性,类型为char,最长长度为150字节    body = models.TextField() # 给表添加一个文本内容的属性,类型为text    timestamp = models.DateField() # 给表添加一个timestamp属性,记录贴子最后编辑的时间

为了将应用添加到服务中,需要修改setting.py中的配置,在INSTALLED_APPS的最后一行添加blog应用。

INSTALLED_APPS = (    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'blog',)



执行如下命令创建应用对应的数据库中的表

D:\lsc\study\python code\lsc_site>python manage.py syncdbOperations to perform:  Apply all migrations: admin, contenttypes, auth, sessionsRunning migrations:  Applying contenttypes.0001_initial... OK  Applying auth.0001_initial... OK  Applying admin.0001_initial... OK  Applying sessions.0001_initial... OK

很奇怪,为什么没有创建blog的数据库表呢?这个问题作者当时也非常纳闷。最后在一篇网络文章中发现,在django1.7及之后的版本中,为了将对新的应用创建数据库的表,需要执行makemigrations和migrate两步操作。其中makemigrations的作用是产生数据库更新的sql文件,migrate则是真正的将应用的表添加到数据库中。

D:\lsc\study\python code\lsc_site>python manage.py makemigrations  # 这一步会在migrations文件夹中新增一个xxx_initial.py文件,用于创建数据库表Migrations for 'blog':  0001_initial.py:    - Create model BlogPost

D:\lsc\study\python code\lsc_site>python manage.py migrate # 向数据库中添加blog这张表Operations to perform:  Apply all migrations: admin, blog, contenttypes, auth, sessionsRunning migrations:  Applying blog.0001_initial... OK

创建完blog应用的数据库表之后,只有重新运行web服务,就可以在控制台对blog应用进行访问和操作了,具体的操作方法参考这篇文章。

我们开发的web应用自然是面向一般的用户的,因此不可能只允许用户在控制台界面访问服务,需要一种可视化的应用服务方法。使用django自带的admin应用就能够非常方便地实现可视化界面下访问我们自定义的应用。我们只需要在model.py中进行如下两处修改即可:

<p>from django.contrib import admin # 导入admin模块</p><p>class BlogPost...</p><p>...</p><p>admin.site.register(BlogPost)</p>

runserver后,我们就可以通过ie浏览器访问我们的应用了。点进去之后,可以操作一下创建和删除帖子。




进去之后,新增两个帖子,发现帖子无法显示标题和时间戳。这是因为没有设置应用的显示方式。




在models.py文件中新建如下 的类
class BlogPostAdmin(admin.ModelAdmin):    list_display = ('title', 'timestamp')

并且注册该类
admin.site.register(BlogPost, <span style="color:#ff0000;">BlogPostAdmin</span>)

重新启动服务后,就可以正常显示标题和时间了。




创建Bolg的公共部分


上面提到的视图是管理员界面,那么如何定义给一般用户浏览的网页呢?这涉及到3个部分------模板,视图,URL。在templates文件夹下新建一个archive.html文件,添加如下内容:
{% for post in posts %}    <h2>{{ post.title }}</h2>    <p>{{ post.timestamp }}</p>    <p>{{ post.body }}</p>{% endfor%}

在view.py中添加如下内容

from django.template import loader, Contextfrom django.http import HttpResponsefrom blog.models import BlogPostdef archive(request):    posts = BlogPost.objects.all() # 获取所有的帖子    t = loader.get_template('archive.html') # 在模板路径下,找到 <span style="font-family: Arial, Helvetica, sans-serif;">archive.html文件作为视图模板</span>    c = Context({'posts': posts}) # 将帖子封装成一个上下文对象    return HttpResponse(t.render(c)) # 返回http响应

上面提到的模板路径是在setting文件的末尾定义的,如下所示。低版本的django中,模板路径可能有所不同,需要根据真实的路径进行填写。
TEMPLATE_DIRS = (    os.path.join(BASE_DIR,  'templates'),)

那么web服务是如何将url跟视图进行关联的呢?答案是在mysite文件夹下的urls.py文件中新添加一条url映射

admin.autodiscover()urlpatterns = patterns('',                       url(r'^blog/', include('blog.urls')), # 以blog开始的url,使用blog.urls文件中定义的方式关联视图                       url(r'^admin/', include(admin.site.urls)),)

blog文件夹下新建一个urls.py文件,添加如下内容

from django.conf.urls import *from blog.views import archiveurlpatterns = patterns('',                       url(r'^$', archive), # 对于所有的url,调用views.py中的archive方法返回html文件给用户                       )

至此,已经可以通过url访问blog的公共页面,如下所示。注意url是端口号之后直接跟着blog。刚开始作者在端口号和blog之间加了admin,结果一直出不来公共页面,还以为代码添加错误了。




模板的润色

上面的模板只是改了一下字体的大小,非常简单。可以通过模板的基类对html模板进行润色。具体的修改方法为,在tempaltes文件夹下创建一个base.html文件(base.html模板是从这里copy过来的,作者对html不熟)

<html>      <style type="text/css">        body{color:#efd;background:#453;padding:0 5em;margin:0}        h1{padding:2em 1em;background:#675}        h2{color:#bf8;border-top:1px dotted #fff;margin-top:2em}        p{margin:1em 0}      </style>           <body>        <h1>XXXblog</h1>        <h3>好好学习,天天向上</h3>        {% block content %}        {% endblock %}      </body></html>

然后修改archive.html文件,使其继承base文件

{% extends "base.html" %}  {% block content %}      {% for post in posts %}      <h2>{{  post.title }}</h2>      <p>{{ post.timestamp | date:"1,F jS"}}</p>      <p>{{ post.body }}</p>      {% endfor %}  {% endblock %}

重新访问公共页面,可以看到显示效果有了很大提升。









0 0
原创粉丝点击