坎蒂丝_Swan 发表于 2014-12-9 14:07:27

Django与Horizon


问题导读
问题1:如何创建并且运行一个简易Blog?
问题2:如何在eclipse中调试horizon?



static/image/hrline/4.gif




无论你对前端web开发有多少了解,想看看horizon的结构,那么请先花一点点时间稍微了解一下Django。

创建工程
django-admin startproject mysite

启动应用服务器
cd mysite && python manage.py runserver

创建应用
./manage.py startapp blog ,

编辑mysite/setting.py文件在INSTALLED_APPS中添加'blog',


数据库Model
$ cat blog/models.py
from django.db import models
class BlogPost(models.Model):
    title = models.CharField(max_length=150)
    body = models.TextField()
    timestamp = models.DateTimeField()


数据库配置,mysite/setting.py
DATABASES = {
    'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'djangodb',                  
      'USER': 'root',                       
      'PASSWORD': 'password',               
      'HOST': '172.16.1.122',                     
      'PORT': '3306',                     
    }
}


创建库之后再创建表
$ vi mysite/settings.py
$ ./manage.py syncdb
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table blog_blogpost
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'hua'):
E-mail address: abcdefg@123.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

设置自动admin应用,即为表增加CRUD方法, 在mysite/setting.py的INSTALLED_APPS中添加:'django.contrib.admin',

再执行./manage.py syncdb命令后增加了数据表django_admin_log.


接着编辑mysite/urls.py文件,取消下列行前的注释:
# from django.contrib import admin
# admin.autodiscover()
# url(r'^admin/', include(admin.site.urls))


最后,在blog.models.py的最后添加一行admin.site.register(BlogPost),变成:
$ cat blog/models.py
from django.db import models
from django.contrib import admin

class Author(models.Model):
    name = models.CharField(max_length=150)

class BlogPost(models.Model):
    title = models.CharField(max_length=150)
    author = models.ForeignKey("Author", related_name="posts")
    #authors = models.ManyToManyField("Author", related_name="posts")
    body = models.TextField()
    timestamp = models.DateTimeField()

class BlogPostAdmin(admin.ModelAdmin):
    list_display = ('title', 'timestamp')

admin.site.register(Author)
admin.site.register(BlogPost, BlogPostAdmin)


上面已经演示了一对多和无其他字段的多对多的关系,如果是多对多的话可能还有一张关联表,并且关联表还有除两个外键以外的其他字段的话:
authors = models.ManyToManyField("Author", through="Authoring")
class Authoring(models.Model):
collaboration_type = models.CharFiled(max_length=100)
post = modles.ForeignKey(BlogPost)
author = models.ForeignKey(Author)


这时候就可以通过http://127.0.0.1:8000/admin/来访问编辑数据表了,用户名和密码是上步设置的。


创建模板与模板继承
$ cat blog/templates/base.html
<h1> base template </h1>
{% block content %}
{% endblock %}

$ cat blog/templates/archive.html
{% 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 %}


创建视图
$ cat blog/views.py
from django.template import loader, Context
from django.http import HttpResponse
from blog.models import BlogPost
def archive(request):
    #posts = BlogPost.objects.all()
    post = BlogPost.objects.get(title='blog1')
    author = post.author
    posts = author.posts.all()
    t = loader.get_template("archive.html")
    c = Context({'posts': posts })
    return HttpResponse(t.render(c))


添加urls
一是mysite/urls.py中添加:url(r'^blog/', include('blog.urls'))

二是添加blog/urls.py文件
$ cat blog/urls.py
from django.conf.urls.defaults import *
from blog.views import archive
urlpatterns = patterns('',
      url(r'^$', archive),
)
这时候通过http://127.0.0.1:8000/blog/就可以访问了。


如果想要在eclipse使用pvdev调试horizon的是一件非常容易简单的事情,首先打上下列patch, 接着在eclipse中创建pydev工程,再在eclipse以debug模式运行python manage.py runserver--noreload即可,和nova, neutron其他工程用pydev调试的方法一模一样,除了下列patch,再没有任何特殊之处,所以没什么好说的。

$ git diff manage.py
diff --git a/manage.py b/manage.py
index 256981c..738e9a5 100755
--- a/manage.py
+++ b/manage.py
@@ -2,10 +2,13 @@

import os
import sys
+from django.core.management import execute_manager

-from django.core.management import execute_from_command_line
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+if ROOT_PATH not in sys.path:
+    sys.path.insert(0,ROOT_PATH)
+import openstack_dashboard.settings

if __name__ == "__main__":
-    os.environ.setdefault("DJANGO_SETTINGS_MODULE",
-                        "openstack_dashboard.settings")
-    execute_from_command_line(sys.argv)
+    os.environ['DJANGO_SETTINGS_MODULE'] = 'openstack_dashboard.settings'
+    execute_manager(openstack_dashboard.settings)


$horizon/horizon/base.py中的HorizonSite类代表整个网站,它继承Site类。

Site类是一个容器类,包含dashboard,panel,及panel下相关url结构解析的相关方法。

概念:一个site下有多个dashboard(其中project和admin是两个dashboard),一个dashboard下有多个panelgroup,一个panel group下有多个panel(如SystemPanel)。

View也是继承关系的,如:ModalFormView,MultiTableView, TabView

$horizon/horizon/templatetags/horizon.py会根据这些dashboard,view等构建网站。

也可以在$horizon/openstack_dashboard/setting.py的MIDDLEWARE_CLASSES定义一些中间件(一般具有process_request, process_view,process_exception, process_response等方法),如horizon.mddleware.HorizonMiddeware, 它的作用相当于拦截器, django会内省这些类,并按顺序调用它们。

代码流程:
1,manage.py中有”import openstack_dashboard.settings”, 它又会调用”from local.local_settingsimport*”,它里面的“from horizon.utils import secret_key”会触发加载$horizon/horizon/__init__.py,它会导入Dashboard,Horizon, Panel, PanelGroup这些类进入正题。



参考:
1,.Django Web开发指南
2.用Eclipse调试Horizon提高开发效率



页: [1]
查看完整版本: Django与Horizon