[C#]Using ADO.NET Data Service - 服务端

mikel阅读(908)

转载:http://www.cnblogs.com/zlgcool/archive/2008/10/15/1312231.html

Using ADO.NET Data Service

 

ADO.NET Data Service是随同Visual Studio 2008 SP1提供的用于构建在数据对象模型 (EF-DEMX, LINQ-DBML) 之时来快速提供企业网内外的轻量级数据服务。ADO.NET Data Service Framework的目标是提供一个天生与web相结合的灵活的数据服务。它其中最醒目的特点就是通过URIs来指向以特定方式(JSON/ATOM)展现的数据(),并以REST方式来展现。所支持的URIs访问方式通过对标准HTTP verbsGET, POST, PUTDelete的支持来完成对数据的CRUD.

本文会通过一个具体的例子来演示如何使用ADO.NET Data Service以及其部分特性。

 

·         选择数据源

 

ADO.NET Data Service是由两部分组成的,一部分是其运行时,它提供了诸如Addressing(URI Translation), Open Format for Data Representation(公开的数据表现形式-JSON/ATOM), 数据传输协议等。另一部分就是数据访问部分,这部分是可以选择的,LINQ或者Entity Framework都是可以的,Data Service本身的功能就是将这些数据源暴露成一个面向web的数据服务。

 

创建一个服务分为两步:

·         ADO.NET Entity Framework来创建一个Entity Data Model – 这是为了以EDM来展现你的数据架构

·         建立数据服务

·         配置用户对数据访问的权限

如何创建一个EDM我们在这里不想多讲,下边的图和简单步骤会告诉你如何来创建一个EDM

1.       创建一个Web Application,这里我们命名为Allan.DataServiceDemo

2.       Solution Explore中右键点击选择添加新项,选择添加ADO.NET Entity Data Model,在Name中输入Northwind.edmx.       

      

3.       Entity Data Model Wizard中设置ConnectionString.点击下一步.

       

4.       在接下来的选择表、视图的窗体中选择你想要加入到EDM中的表。这里我们选择Employees, TerritoriesEmployeesTerrories表,然后点Finish. 到此我们的EDM已经完成了。接下来我们要做的事在EDM的基础上来构建Data Service.

 

·         创建数据服务

 

5.       右键点击项目并在弹出菜单中选择添加新项目。在弹出的对话框中选择 ADO.NET Data Service, 并将名称更名为NorthwindService.svc.通过这里你会发现,其实ADO.NET Data Service本质上是一个WCF.

 6.       Service本身已经建立,但现在还没有将数据暴露给客户端,并且没有相应的数据访问控制。当点击上一步中的Add按钮后,系统会打开NorthwindService.svc.cs文件,在这里我们需要做如下更改来暴露数据。

a.       将数据访问层类设立为被暴露的服务的数据源

b.      设定对相关数据实体集的权限和可访问性。

要做到这两点只需要更改一下所示的高两部分即可。第一个高两部分表示我们将NorthwindEntities作为我们的数据源。NorthwindEntities是我们刚才创建的EDMX的类名,Employees等表都已经作为其属性被Mapping成对象。第二个高亮部分是控制EntitySet(其实就是对应的表一级)的访问权限。例如你仍然可以通过下边的代码仅仅暴露Employees对象的只读权限:config.SetEntityAccessRule(“Employees”,EntitySetRights.AllRead.这样,服务只会暴露Employees集合并且只接受读取,而不能有更新操作。

public class NorthwindService : DataService<NorthwindEntities>

    {

        // This method is called only once to initialize service-wide policies.

        public static void InitializeService(IDataServiceConfiguration config)

        {

            // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.

            // Examples:

            config.SetEntitySetAccessRule("*", EntitySetRights.All);

            // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);

        }

    }

大功告成,你可以通过View In Browser来验证你的工作是否正确。

 

·        Addressing: Accessing Data Service via URIs

 

在前边提到过,Data Service通过URIs来指向a piece of data。也就是说我们通过URL就可以来做到访问数据,并且具有一定的数据过滤功能。抛弃高级的查询选项不说,基本的URL就可以来访问EntitySetEntity,以至于某个字段,字段的值等等。通过浏览你的Northwind.svc,我们可以看到以下数:

这里暴露了EmployeesTerritories两个数据集,这和我们之前设定的是相同的。通过以下的访问列表,你可以很容易的来在这个数据集合中导航,并获取你想要的数据。

Resource

URI

Service

http://localhost:4588/NorthwindService.svc/

Entity Set

http://localhost:4588/NorthwindService.svc/Employees

Entity

http://localhost:4588/NorthwindService.svc/Employees(1)

Relationship

http://localhost:4588/NorthwindService.svc/Employees(1)/Address

Property

http://localhost:4588/NorthwindService.svc/Employees(1)/Address/City

Property

http://localhost:4588/NorthwindService.svc/Employees(1)/FirstName

ADO.NET Data Service同样提供了以下的查询选项:

Option

Description

Example

expand

类似于LINQ中的LoadOptions,以此来指定加载此对象相关的通过expand指定的对象。如果需要加载多个对象,用逗号分隔。

http://localhost:4588/NorthwindService.svc/Employees(1)?$expand=Territories

同事加载当前employee对应的Territories.

orderby

指定排序方式。语法为:$orderby=Field [ASC|DESC], [Field[ASC|DESC]]

http://localhost:4588/NorthwindService.svc/Employees?$orderby=FirstName

Skip

Top

类似于LINQ中的Skip(PageSize * PageIndex).Take(PageSize)用来实现分页。表示越过多少条记录,取接下来开始的几条记录。也可分开始使用两个选项。

http://localhost:4588/NorthwindService.svc/Employees?$orderby=FirstName&$skip=3&$top=3

http://localhost:4588/NorthwindService.svc/Employees? $skip=3  

Filter

通过filter这个参数可以在URL里传递过滤条件。

http://localhost:4588/NorthwindService.svc/Employees?$orderby=FirstName&filter=substringof(FirstName,'A')

对于如上边所示的查询表达式,ADO.NET Data Service提供了一些函数和标记来帮助我们组建适合的查询表达式(Query Expression).下表总结了常见的组建Query Expression的标记、函数等,以供查询和参阅。

1.       Logical Operators – 逻辑运算符

Operator

Description

Operator

Description

eq

Equal

ne

Not Equal

gt

Greater than

ge

Greater than or equal

lt

Less than

le

Less than or equal

and

Logical and

or

Logical or

not

Logical negation

()

Precedence grouping

 

2.       Arithmetic Operators – 算数运算符

Operator

Description

Example

add

Addition

/Product?filter=UnitPrice add 5 gt 10

sub

Subtraction

/Product?filter=UnitPrice sub 5 gt 10

mul

Multiplication

/Orders?$filter=Freight mul 800 gt 2000

div

Division

/Orders?$filter=Freight div 10 eq 4

mod

Modulo

/Orders?$filter=Freight mod 10 eq 0

3.       Functions – 函数

String Functions

bool substringof(string p0, string p1)

bool endswith(string p0, string p1)

bool startswith(string p0, string p1)

int length(string p0)

int indexof(string arg)

string insert(string p0,int pos, string p1)

string remove(string p0, int pos)

string remove(string p0, int pos, int length)

string remove(string p0, string find, string replace)

string substring(string p0, int pos)

string substring(string p0, int pos, int length)

string tolower(string p0)

string toupper(string p0)

string trim(string p0)

string concat(string p0, string p1)

 

Date Functions

int day(DateTime)

int hour(DateTime)

int minute(DateTime)

int month(DateTime)

int second(DateTime)

int year(DateTime)

Math Functions

double round(double)

decimal round(decimal)

double floor(double)

decimal floor(decimal)

double ceiling(double)

decimal ceiling(decimal)

       

通过这些看似简单的函数和逻辑/算数操作符,可以在很大程度上通过URL来做一些简单的查询和过滤。通过分析查询结果你会清楚的看到:

·         当有多个对象被返回是,在atom模式下,数据以feed的方式返回。

·         每个entry包含一个对象。

·         每个entry会提供link标签来给出自己的URL和其关联对象的URL

·         属性会被包含在Content内部以application/xml表示

·         每个属性都是content内一个子节点。

·         所有的数据和关系均以纯XML表现

·         默认情况下关联对象不被加载(expand可以加载)

  

·        Query Interceptors – 查询拦截

查询拦截非常有用,它起个代理或者把关的作用。当你仅仅想把具有某种状态或者特征的数据返回给客户端时,用拦截查询就可以实现。比如,数据库中的Employee信息,对于已经离开公司的员工我们会将其状态设置为Leave,而在我们不打算将这些信息流露出去时,写一个Query Interceptor仅仅返回状态<>Leave的记录,那么所有客户端请求与Employee有关的数据时将被强制只能得到状态不为Leave的记录。换句话说,Query Interceptor的代理函数返回的数据在表面上替换了Employees的记录。

下边的示例限定了客户端仅能得到国家是USAEmployees信息:

[QueryInterceptor("Employees")]

public Expression<Func<Employees, bool>> ReturnUSAEmployees()

{

    return e => e.Country == "USA";

}

Query Interceptors是面向EntitySet(也就是Table)的,通过修改QueryInterceptorAttribute的参数,你可以给任何一个EntitySet来创建一个查询拦截器。看看我们刚才设置的查询拦截器是否工作呢?

 

没错,仅仅返回了5Country=USA的记录。Nice!

·        Change Interceptors – 数据更新拦截

看起来,Change InterceptorsQuery Interceptors很相似,都是用来拦截客户端操作的。不同的是,前一个word,一个是面向query的,一个是面向change的。顾名思义,Change Interceptors面向的就是提交到服务器的的数据更新操作:包括Add, Change Delete,分别对应在数据添加操作,数据更改操作和数据删除操作这些是由UpdateOperations参数来提供的。下边的示例实现了在执行添加操作时,如果Employee实例的Country属性为空,则默认设置为USA:

[ChangeInterceptor("Employees")]

public void AssignDefaultCountry(Employees c, UpdateOperations operation)

{

    if (operation == UpdateOperations.Add)

    {

        if (c.Country.Trim().Length == 0)

        {

            c.Country = "USA";

        }

    }

}

不要忘记给这个方法加入ChangeInterceptor属性。而对于所拦截的操作对象,同样是通过更改ChangeInterceptorAttribute的参数来实现的。

·        扩展ADO.NET Data Service

ADO.NET Data Service 为我们提供了快速构建一个数据服务的平台,但到目前为止,除了数据库中的对象(还不包括存储过程),我们仍然无法加入自己的方法,这显得好像很不灵活。当然,ADO.NET Data Service还是为我们提供了这样的一种方式来扩展已有的整套生成好的数据服务的。你可以添加一些你自己的方法,例如操作存储过程,自己的逻辑,返回特殊处理后的数据这样的方法,然后通过添加WebGetAttribute来使其变成一个ServiceOperation来暴露给客户。

[WebGet]

public IQueryable<Employees> GetEmployeesByCountry(string country)

{

    var employees = from c in this.CurrentDataSource.Employees

                                 where c.Country == country

                                 select c;

 

    return employees;

}

 

同时还要设置这个方法的权限(InitializeService方法中)

config.SetServiceOperationAccessRule("GetEmployeesByCountry", ServiceOperationRights.All);

 

如何去访问这个方法呢?因为你无法再meta中(实际上就是http://localhost:4588/NorthwindService.svc)找到对这个方法的描述。很简单,直接试验一下下边的URL是否工作呢?

http://localhost:4588/NorthwindService.svc/GetEmployeesByCountry?Country='USA'

 

服务端的设置好像该有的都有了哦?除了Data Service的表现方式:Atom还是JSON,这个另行解决吧,起码得有传输的数据包来展现。另外的有关客户端消费的(服务端消费和客户端AJAX消费)我们在下一个话题中来介绍吧🙂 

 

点击链接下载练习代码: http://files.cnblogs.com/zlgcool/Allan.DataServiceDemo.rar

[Django]编写第一个Django app,第三部分——玩转模型层的API

mikel阅读(786)

玩转模型层的API

现在,让我们进入Python shell中玩转Django为我们提供了的免费的API。使用下面的命令运行Python shell:

  python manage.py shell

现在你已经进入到shell中了,研究一下这些数据库的API吧:

Code

 

等下。<Poll: Poll object> 根本就不能帮助我们描述这个对象。让我们编辑polls模型来修正它(在polls/models.py文件中),给Poll和Choice方法各添加一个__unicode__()方法。

class Poll(models.Model):
# 
    def __unicode__(self):
return self.question
class Choice(models.Model):
# 
    def __unicode__(self):
return self.choice

 

如果__unicode__()看起来没有执行

如果你给你的models添加的__unicode__()方法并没有看到它们的描述信息有变化,你很可能正在使用的是旧版本的Django。(本教程是面向Django最新的开发版写的。)旧版使用__str__()方法。

给你的models添加__unicode__()方法是件很重要的事情,它不仅仅是为了使你在提示窗口中得到智能的提示,更是因为对象的描述在Django自动生成的admin中会使用到。

为什么是__unicode__()而不是django.db.models.Model.__str__()?

如 果你熟悉Python的话,你可能习惯于给你的类添加django.db.models.Model.__str__()方法而不是 __unicode__()方法。我们这里之所以使用__unicode__()是因为Django models默认是处理Unicode的。所有保存在你的数据库中的数据在返回的时候都转换为Unicode。

Django models有一个默认的方法django.db.models.Model.__str__(),它会调用__unicode__()方法并返回一个 UTF-8格式的字符串。也就是说,unicode(p)将会返回一个Unicode的字符串,而str(p)将会返回一个普通的字符串,它的字符是被编 码为UTF-8的。

如果你还不理解的话,你只要记得给你的models添加__unicode__()方法就行了。如果运气不背的话,事情就会如你所愿的执行。

注意下面这些普通的Python方法。让我们添加一些自定义的方法,就如例子所演示的:

 

import datetime
# 
class Poll(models.Model):
# 
    def was_published_today(self):
return self.pub_date.date() == datetime.date.today()

 

注意到,我添加了import datetime来引用Python的标准datetime模块。

让我们再次运行python manage.py shell来进入Python shell吧:

 

Code

 

如果还有读者还不熟悉Python和Django的安装,请阅读我写的一篇关于这方面的教程:

[Django]编写第一个Django app,第二部分——创建模型和使用模型

mikel阅读(719)

转载:http://www.cnblogs.com/reallypride/archive/2008/11/29/1343615.html

创建模型

现在你的运行环境——"project"——已经建好了,现在准备让它开始工作了。

你在Django中写的每一个应用程序都是由Python包组成,它们都在Python的路径下,遵循一定的约定。

Django自带有一个实用的工具,自动生成app的基本目录结构,因些,你可以把更多的精力放在代码的编写上而不是创建目录上。

Projects vs. apps(项目与应用程序)

project和app之间有什么不同之处呢?一个app是实现某种功能的Web 应用程序——例如,一个网络博客系统,一个公共记录的数据库或一个简单的投票程序。一个project是具体网站app和配置的集合。一个project 可以包含多个apps。一个app可以在多个project中。

在本教程中,我们将会在mysite文件夹中简单地创建我们的poll app。因而,这个app属于这个project——mysite,在poll app中的python代码相当于mysite.polls。在本程序后面,我们会讨论发布您的apps时的解耦。

要创建你的app,先要确保你是在mysite文件夹中,然后输入这些命令:

  python manage.py startapp polls

它们将会创建一个polls文件夹,里面的内容是:

  polls/

    __init__.py

    models.py

    views.py

这个目录结构就是app应用程序。

编写数据库Web应用程序的第一步是定义你的模型层——基本上就是你的数据库的布局,但添加了些额外的元数据。

在我们的简单的poll app中,我们将会创建两个模型:polls和choices。poll包含question和publication date。choise有两个字段:选择的文字和投票记分。每个choise都和一个poll关联。

这些概念可以用简单的Python类来描述。把文件polls/models.py编辑成如下面的样子:

  from django.db import models

  class Poll(models.Model):
      question = models.CharField(max_length=200)
      pub_date = models.DateTimeField('date published')

  class Choice(models.Model):
      poll = models.ForeignKey(Poll)
      choice = models.CharField(max_length=200)
      votes = models.IntegerField()

关于max_length的错误

如果Django给你一个错误信息提示max_length不是正确的参数,你很可能使用的是旧版的Django。(本教程是针对Django最新的开发版本写的)(顺便说一下,旧版使用的参数是maxlength)。

这些代码都比较简单直观。每个模型都对应一个类,它是django.db.models.Model的子类。每个模型都包含有一些类级变量,它们代表数据库的字段。

每个字段都是Field类的实例——如,CharField是character字段,DateTimeField是日期字段。这些变量告诉Django字段保存的数据类型。

Field实例名(如question或pub_date)是字段的名字,使用机器友好的格式。你可以在Python代码中使用它们,也可以在数据库中作为列名使用。

你可以使用第一个可选的参数来定义Field的人性化的名字。它在Django中作为提示的内容。如果这个字段没有提供,Django将使用对机器 易读的名字。在这个例子中,我们只为Poll.pub_date定义了人性化的名字。模型中的其它字段都是使用对机器易读,对人不易阅读的名字。

一些Field类需要参数。例如CharField,需要你给出max_length。它不仅是用于数据库的架构信息中,还用于数据验证,等会我们就会看到了。

最后,关注一下关联的定义,使用ForeignKey。它告诉Django每个Choice和一个Poll关联。Django提供有所有常用的数据库关联:多对一,多对多,一对一。

使用模型

这些少量的模型代码给了Django大量的信息。通过它,Django能够做这些事情:

  1.为这个app创建数据库的架构信息(Create TABLE 声明)。

  2.创建Python的数据库访问API来获取Poll和Choice对象。

但首先,我们要告诉我们的project,polls app已经安装好了。

再次编辑settings.py文件,修改INSTALLED_APPS的设置,加入字符吕'mysite.polls'。这样,它的代码看起来如下:

  INSTALLED_APPS = (
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.sites',
      'mysite.polls'
  )

现在,Django已经知道了mysite中包含有polls app。让我们运行另一个命令:

  python manage.py SQL polls

你应该会看到一些类似于下面的信息(polls app的Create TABLE SQL描述语句)

BEGIN;
Create TABLE "polls_poll" (
    "id" serial NOT NULL PRIMARY KEY,
    "question" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);
Create TABLE "polls_choice" (
    "id" serial NOT NULL PRIMARY KEY,
    "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"),
    "choice" varchar(200) NOT NULL,
    "votes" integer NOT NULL
);
COMMIT;

注意以下各项:

  1.这些输出依赖于你所使用的数据库。

  2.表名是自动生成的,由app(polls)名和模型名的小写组成——poll和choice。(你可以重写这个行为)

  3.主键(IDs)是自动添加的。(这个你也可以重写)

  4.为了方便,Django在外键字段名后面加上"_id"。你也可以重写这个。

  5.外键关系使用显式的REFERENCES声明。

  6.它根据你使用的数据库做不同的调整,因些一些特殊的字段类型,如auto_increment(MySQL),serial(PostgreSQL),或integer primary key(SQLite)

     都会为你自动处理。相同地,对于引号也是如此。——如,使用单引号或双引号。本教程的作者使用的是PostgreSQL,因此例子中输出的是使用

   PostgreSQL的语法。

  7.这些sql命令并不是运行在数据库的实际的SQL,它只是打印在屏幕上,因些你能看到Django认为需要使用什么SQL语句。如果你愿意,你可以copy

     并粘贴这些SQL到你的数据库提示框中。然而,很快你就会看到,Django提供了更简单的方法来向数据库执行这些SQL语句。

如果你有兴趣,你还可以运行下面的命令:

  1.python manage.py validate —— 检查模型的结构上是否有错误。

  2.python manage.py sqlcustom polls —— 输出所有在应用程序中定义的自定义SQL描述(如表的限制或约束)。

  3.python manage.py sqlclear polls —— 输出在这个app中删除已存在的表的Drop TABLE描述。

  4.python manage.py sqlall polls —— 一个组合所有的sql,sqlcustom和sqlindexes的SQL命令.

从这些输出的命令中能帮助我们了解在自动生成引擎下实际做了些什么事情。

现在,再次运行syncdb在你的数据库中创建这些模型的表。

  python manage.py syncdb

syncdb命令在你的数据库中运行从'sqlall'中得来的sql命令,它只运行在INSATLLED_APPS中,还没有保存存在你的数据库中的apps。

它创建所有的表,初始化数据和索引你最后一次运行syncdb时你已经添加到你的工程中的apps。syncdb你想运行多少次都可以,

它只创建还没有存在的表。

 

因为第一次翻译英文资料,计算机术语了解得不多,英语水平也不行,翻译得不够准确的地方还请多多包涵。

[Django]编写第一个Django app,第一部分——创建项目

mikel阅读(911)

转载:http://www.cnblogs.com/reallypride/archive/2008/11/28/1343356.html

编写第一个Django app,第一部分——创建项目

让我们通过例子来学习。

通过这个指导教程,我们将一步步地教你创建一个简单的投票系统。
这个系统分为两部分:
1.一个公共的页面让人们投票和查看投票结果。
2.一个管理员页面让你添加,修改和删除投票。

我们假定你已经安装了Django。你可以运行Python编译器并输入import django
来测试Django是否已经安装。如果命令运行成功,没有错误,说明Django已经安装了。

新建项目

如果你是第一次使用Django,你必须确保一些初始化已经完成。也就是,你需要自动生成
一些代码来创建Django项目——一系列的Django设置实例,包括数据库配置,Django特定
的选项和程序特定的设置。

使用命令行,cd进入你要保存你的代码的文件夹,运行命令django-admin.py startproject mysite。
它会在当前文件夹里创建一个mysite文件夹。

如果你是通过python setup.py安装Django的话,django-admin.py将会在你的系统路径下。
如果不在你的路径下,你可以在site-packages/django/bin中找到它,site-packages是你的Python的
安装目录。
(对于上面这段话我不是很理解,我是把django-admin.py拷贝到存放代码的文件夹下,然后运行命令
django-admin.py startproject mysite来创建项目的)。

让我们看一下startproject生成了些什么:
mysite/
 __init__.py
 manage.py
 settings.py
 urls.py
这些文件是:
1.__init__.py:一个空文件,它用来告诉Python把这个文件夹看成是一个Python包。(如果你是一个初学者,
  阅读Python的官方文档来了解更多的关于包的内容。)
2.manage.py:一个实用的命令行,它让我们通过各种各样的途径和Django项目进行交互。
3.settings.py:设置/配置Django项目
4.urls.py:Django项目的URL映射。

开发版服务器

让我们确认这些工作。切换到mysite文件夹,运行命令python manage.py runserver。你将会看到命令行
输出下面的信息。
Validating models…
0 errors found.

Django version 1.0, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

你已经启动了Django的开发版服务器,一个用纯Python写的轻量级Web服务器。我们已经把它包含在Djangok ,
所以你能快速地开发项目而不用配置产品服务——例如Apache——直到你将要发布产品。

现在这是一个好的时机来注意:不要使用这个服务器作为产品的运行环境。它仅仅是在开发的时候使用。
(我们的业务是开发Web框架而不是Web服务器。)
现在这个服务器已经运行,使用你的浏览器浏览http://127.0.0.1:8000/
你将会看到一个"Welcome to Django"的亮蓝色粉蜡笔的页面。它已经工作了。

改变它的端口
默认情况下,runserver命令在8000端口启动开发版服务器。如果你想改变服务器的端口,把端口号作为
命令行参数传入。例如,这条命令在8080端口中启动服务器:
python manage.py runserver 8080

(在我的电脑上,使用python manage.py runserver启动服务器会报错,把命令前面的python去掉
就能正常运行了,不知道是怎么回事。)

准备数据库

现在,编辑settings.py。它是一个包含有与Django设置相对应的模块级变量的常规的Python模块。
修改这些设置以匹配你的数据库连接参数:
1.DATABASE_ENGINE—— 'postgreSQL_psycopg2', 'mySQL' or 'sqlite3'中的一个,
  其它的也适用。
2.DATABASE_NAME——数据库的名字。如果你使用的是SQLite,数据库是你电脑上的一个文件;因些,
  DATABASE_NAME就是文件完整的绝对路径,包含文件名。如果文件不存在,它会在你第一次使用数据库
  的时候创建。
  当指定文件的路径时,要使用斜线,即使是在windows下(如C:/homes/user/mysite/sqlite3.db)。
3.DATABASE_USER——你的数据库的用户名(SQLite不使用)。
4.DATABASE_PASSWORD——你的数据库的密码(SQLite不使用)。
5.DATABASE_HOST——数据库所在的主机。如果你的数据库在相同的物理机器上,保留它为空字符串(SQLite不使用)。

如果你是个数据库新手,我们建议你使用简单的SQLite(把DATABASE_ENGINE设置为'sqlite3')。
SQLite是Python2.5和更新的版本的一部分,因此你不需要安装任何东西。
如果你使用的是PostgreSQL或者MySQL,要确保你已经创建了数据库。要创建数据库可以在数据库的交互对话框中
使用命令"Create DATABASE database_name;" 。
如果你使用的是SQLite,你不需要预先创建任何东西——数据库会在需要它的时候自动创建。

当你编辑settings.py的时候 ,注意下面的INSTALLED_APPS的设置。片个变量保存所有已经激活的Django应用
程序的Django实例的名字。Apps能在多个项目中使用,你可以打包和发布它们,让它们在其它项目中使用。

默认情况下,INSTALLED_APPS包含有下面的apps,它们都是来自于Django:
1.django.contrib.auth — 用户验证系统。
2.django.contrib.contenttypes — 内容类型框架。
3.django.contrib.sessions — session框架。
4.django.contrib.sites — 使用一个Django管理多个站点的框架。
这些应用程序默认是包含的,方便通常情况下的使用。

每个应用程序都需要使用和至少一个数据表,因些我们在使用它们之前要先创建数据表。0
要做这些事情,使用下面的命令即可:
python manage.py syncdb

syncdb命令在你的settings.py文件中查找NSTALLED_APPS的设置并使用数据库的设置创建所需要的数据表。
你将会看到每个数据表的创建信息,并且如果你为验证系统创建超级用户帐号的话,你将会看到一个对话框。
继续,并完成它。

如果你感兴趣,运行你的数据库客户端命令行,输入\dt (PostgreSQL), SHOW TABLES; (MySQL),
或者 .schema (SQLite)来显示Django创建的表。

就如上面所说的那样,默认应用程序包含这些是为了一般情况下的需求,但并不是每个人都需要使用它们。
如果你不需要它们,你可以把它们从INSTALLED_APPS中注释掉或者删除掉,不过这要在你运行syncdb命令之前。
syncdb命令只创建在INSTALLED_APPS中的apps的表。

[Delphi]Delphi Prism

mikel阅读(1000)

  很多年来Delphi都是Windows平台上强有力的竞争者。它将VB的快速应用开发和更加强大的语言结合起来。然而当.NET横空出世 后,Delphi逐渐丧失了其霸主地位。Delphi的Win32编译器已经被人所淡忘,同时Borland也将精力转向了.NET开发。Delphi 8不再支持Win32开发,同时其.NET版本也与之前的程序不兼容。由于这个原因,再加上稳定性的问题,最终导致大多数开发者放弃了Delphi 8和9。

由于最近Embarcadero Technologies收购了Borland的开发部门,这令Delphi获得了新生。其核心产品Delphi 2009又重新开始关注Win32开发了。同时,微软最近在协议上的变化又给了新版本的Delphi一个出路。

去年,我们曾报道过微软准备向独立的系统供应商免费提供Visual Studio。这个名为Visual Studio Shell的版本可用作任何开发套件的基础。Embarcadero正在用其开发Delphi Prism。

Delphi Prism给Embarcadero带来了一些Borland未曾拥有的东西。通过将Visual Studio Shell作为起始点,他们可以立刻与微软的专业开发工具展开竞争而无需弥补迷失的那几年光阴。

凭借Delphi Prism,Embarcadero可以专注于微软比较欠缺的领域:跨平台开发。通过使用Visual Studio和Delphi Prism,开发者编写的程序可以运行在非微软的操作系统上。

敞开说吧,Delphi Prism提供了Gtk#的项目模板、OS X上的WinForms、面向OS X/Tiger的Cocoa以及面向OS X/Leopard的Cocoa。Tim Anderson补充到:

我推荐在Mac上的VM运行Visual Studio,因为Windows无法运行Cocoa应用。同时你需要使用Apple的Interface Builder,因为在Visual Studio中并没有GUI设计器。

这并不是第一次提出将Delphi作为一个跨平台的开发工具了。有一个名为Kylix的项目,它支持Linux操作系统。但它的价格太高,同时其稳定性还很让人质疑,更不用说与Delphi源代码的不兼容性了,因此它很快就失败了。

[Json]将List对象列表转换成JSON格式的类

mikel阅读(848)

转载:http://www.cnblogs.com/pcode/archive/2008/11/26/1341607.html

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。引用于[http://www.json.org/json-zh.html]

一般应用中,我习惯性地把结果集以更通用的IList<object>对象列表方式保存(可能会对性能有些影响)来保证类间交互时的通用性,降低函数功能对具体类的耦合。但AJAX调用时,还需要把对象列表转换成JSON数据交给前端显示。有麻烦。

     研究了一下JSON的对象定义和集合定义

 

     感觉利用反射来生成JSON还比较方便。代码如下:

 

Code

 OK,我们建立一个测试来验证一下它是否生效。

先建立一个对象定义person.cs

Code

然后建立测试类

我用了一种非常原始的方法生成了对象列表,其实可以从数据库查询,怕把事情搞得太复杂。呵呵。

Code

跑一下Nuint,我们想要的json串已经生成了。

[C#]项目管理实践【四】Bug跟踪管理【Bug Trace and Management】

mikel阅读(1857)

首先,向大家说一声抱歉,这篇文章耽误了这么久才和大家见面。
至于Bug的跟踪和管理的必要性和好处,我就不在这里说了,下面介绍几款Bug跟踪和管理的软件。

一、BugNET

BugNET是一个非常优秀的开源软件,基于.NET Framework2.0 ,使用ASP.NET+SQL Server开发的网站项目, 另外项目中还使用了Microsoft Report Viewer Redistributable 2005Microsoft ASP.NET AJAX 1.0。

最新版本是:BugNET 0.7.921.0

官方主页:http://bugnetproject.com/

最新版本下载:http://downloads.sourceforge.net/bugnet/BugNET-0.7.921-Install.zip

源代码下载:http://downloads.sourceforge.net/bugnet/BugNET-0.7.921-Source.zip

英文文档:http://bugnetproject.com/Documentation/tabid/57/topic/Installation/Default.aspx

它具有发送邮件、生成报表、项目配置管理、人员及权限管理、Bug管理等等功能。下面简单说一下它的安装和配置:

 1.解压缩最新的BugNET安装包到一个指定目录中(比如 C:\BugNET)。如果需要源代码,请到这里下载。

 2.确保你已经在你机器的IIS上为BugNET创建一个虚拟目录,指向你第一步中解压出来的文件所在的文件夹(比如:C:\BugNET)。那么URL就应该是http://localhost/BugNet

 3.使用Windows资源管理器,打开网站的根目录(默认是C:\BugNET)。右键点击该目录,在弹出菜单中选择"共享和安全"(请注意: 如果你是有的是Windows XP,在查看这些选项之前,你可能需要启用"简单文件共享")。选择"安全"选项卡。添加合适的用户帐户并设置权限。

如果你使用的是Windows2000-IIS5
– 用户帐户{Server}\ASPNET 必须具有BugNET对应的虚拟目录的读、写和修改权限
如果你使用的是Windows2003 – IIS6
– 用户帐户 NT AUTHORITY\NETWORK SERVICE必须具有BugNET对应的虚拟目录的读、写和修改权限

 4. 在你的SQL Server上创建一个空的数据库(例如数据库名称是'BugNET')。如果是升级操作,那么在做任何操作之前,请备份你的数据库。

5.使用文本编辑器编辑Web.config文件。找到"LocalSQLServer"连接字符串设置,并修改"connectionString"属性值和你在第四步中创建的数据库一致。

<connectionstrings>
</clear>
<add name="LocalSQLServer"
connectionstring="server=MyServer;database=BugNet;uid=BugNet;pwd=BugNet"
providername="" />
</connectionstrings>

6.浏览http://localhost/BugNet/Install/Install.aspx (或者你在第二步中创建的虚拟目录)。

7.安装进程开始。

8.安装完成后,你就可以使用admin用户帐户登录了。

用户名:admin
密码:password

这样,你的BugNET安装完成了,应该可以在http://localhost/BugNet 访问,如果有什么安装问题,请访问支持论坛

下面是运行后,BugNET首页的截图:

我想看完这篇文章,你一定会自己试一试吧!

OK, That's all what I say , and now, it's your turn.

不好意思,由于下面的二款软件不太熟悉,而且由于最近压力比较大,实在也抽不出时间,所以找了一些相关的资料给大家参考,请大家见谅!

二、BugFree

BugFree是借鉴微软公司 软件研发理念、免费且开放源代码、基于Web的精简版缺陷管理系统。它是目前唯一"克隆"微软内部Bug管理工具 Product Stuido(以前叫Raid)的自由软件。BugFree是用PHP+MySQL写,在Linux和Windows平台上都可以运行,我们推荐的使用环 境是LAMP(Linux+Apache+MySQL+PHP)。

下面是是园子里的一些资源,由于同类的资源较多,只选取了较新的几篇。

Bugfree使用点滴。

http://www.cnblogs.com/idragonet/archive/2008/06/04/1213357.html

[原创]如何在Windows下安装Bugfree2.0.0.1

http://www.cnblogs.com/mayingbao/archive/2008/09/09/1287523.html

缺陷管理工具bugfree安装说明

http://www.cnblogs.com/etian/archive/2008/06/05/1214588.html

 

三、Trac+Apache+SVN

Trac 是一个为软件开发项目需要而集成了Wiki和问题跟踪管理系统的应用平台,是一个开源软件应用。 Trac 以简单的方式建立了一个软件项目管理的Web应用,以帮助开发人员更好地写出高质量的软件; Trac 应用力求不影响现有团队的开发过程。

Trac功能:

Wiki:这个就不用说了吧
Timeline: 可以看看最近有哪些文件被更新, 可以快速跟上进度
Roadmap:项目进度包括那些阶段, 可以看目前进度状况,依照 Ticket的设定, Ticket 可以指向某个 Milestone, 已便追踪目前项目的完成进度.
Browse Source: 和SVN集成后,可以查看源代码及SVN的代码提交日志
View Tickets: 看目前有哪些Ticket, 看哪些沒有完成(常用: My Tickets, Active Tickets) 等等
          Tickets包含下面的类型:

  1. Active Tickets – 目前有哪些 Tickets 是 Active 的
  2. Active Tickets by Version
  3. Active Tickets by Milestone – 靠 Milestone 划分 Active Tickets
  4. Assigned, Active Tickets by Owner
  5. Assigned, Active Tickets by Owner (Full Description)
  6. All Tickets By Milestone (Including closed) – 列出所有 Tickets
  7. My Tickets – 列出属于自己的 Tickets
  8. Active Tickets, Mine first – 列出所有 Active Tickets, 依照重要性排列

New Ticket:添加一个新的Ticket,即一个可能的Bug条目。
Search:搜索功能

下面是园子里的一些文章,大家如果有兴趣,也可以到网上找到很多类似的文章。

Trac 手记(一) : Windows 下安装 Trac

http://www.cnblogs.com/zealic/archive/2007/12/29/1019837.html

win32上安装Apache+SVN+Trac笔记

http://www.cnblogs.com/nobel1984/archive/2008/11/03/1325772.html

您可以查看这个系列的全部文章:项目管理实践入门系列教程


作者:ttzhangTechnology Life–张涛的技术博客
出处:http://ttzhang.cnblogs.com/
本文版权由作者全部保留,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Tag

[网站]FileRide——与众不同的社交网站

mikel阅读(856)

FileRide是一个很别致的社交网 站,总部位于斯德哥尔摩:该网站围绕你电脑上的文件,为你打造一个社交网络。比如说,可以让你知道在该网站上,哪个用户的电脑上有你喜欢的音乐和图片,你 可以把它们加为好友。你还可以就这些文件进行评论和即时交流。但是你不能通过该网站传送文件。目前该网站客户端支持XP和Vista,OSX和手机版正在 开发中。

围绕文件做文章

和基于现有关系网的其他网站不同,FileRide更加关注共同爱好。你不用再去寻找知音,你收藏的音乐和youtube视频就可以帮你打造一个关系网。

当你复制或者粘贴文件、图片或者链接时,FileRide桌面程序就会通知你是否将其加入FileRide。你还可以直接拖拽文件到FileRide。

FileRide会给图片和音乐制作“数字手印”,重命名之后也可以识别。

此外FileRide还包括微博客、类似Facebook的应用,朋友和小组的订阅种子,桌面消息提醒等。

FileRide很快就可以识别ISBN和其它格式文件了。

11月30日之前注册

如果你想使用,最好在11月30日之前,之后将改为邀请注册。

结论

总的来说该网站还不错,很多地方需要改进,但是正在高速增长,主要靠口碑传播。

[AJAX]Ajax与iframe

mikel阅读(826)

转载:http://www.cnblogs.com/blacktear23/archive/2008/11/26/1341408.html
  Ajax
已经如日中天,很多Ajax的框架让我们已经能轻松享受Ajax技术的美妙。不过Ajax也有美中不足。如果我们使用JQuery的话,用Ajax进行一个异步的调用,我们会发现一个小问题,如果请求一个以GB2312编码的页面,更新后的结果就会是乱码。无论是在FF还是在IE上都是如此:

1 <script>
2 $.get(“URL”, function(data) {
3        $(“#content”).html(data);
4 });
5 </script>
6 <div id=”content” />

 

    其原因在于JQueryAjax只支持UTF-8编码。当我们传入GB2312编码时,在解码的过程中会出现问题。不过这对于动态页面来说,非常容易解决,在输出页面内容时转换成UTF-8编码即可。不过如果请求的是一个静态页面,或者是别人的页面,那么我们就没有太好的办法来使用Ajax了。

    不过iframe倒是一个比较好的替代品,有经验的开发者都了解,把iframesrc属性指向另外一个URL就可以改变其中的内容,而且对编码并不敏感。但仍旧有一个问题就是iframe不能自动跟随内容的多少来调整其大小。

    在网上搜“iframe 自适应”可以搜到很多自动调整iframe大小来适应内容量的JavaScript代码。不过这些代码或多或少有一些跨浏览器问题。在IE上,基本上都是可行的。而在FF上有些代码就失去了效力了:

 1 function ResizeIFrame (id){
 2        var iframe=document.getElementById(id); //iframe id
 3        if (document.getElementById){
 4               if (iframe && !window.opera){
 5                      if (iframe.contentDocument && iframe.contentDocument.body.scrollHeight){
 6                             iframe.height = iframe.contentDocument.body.scrollHeight;
 7                      }else if(iframe.Document && iframe.Document.body.scrollHeight){
 8                             iframe.height = iframe.Document.body.scrollHeight;
 9                      }
10               }
11        }
12 }

 

    上面这段代码在IE上是没有问题的,而在FF3上就会出现问题:scrollHeight经常返回0,似乎FF3并不对iframe的内容计算其实际高度。不过如果你的用户只用IE,那么将就一下也算可以。如果你想做得更完美一些的话,这种“自适应”方法却有问题。

    不过从上面的代码中,我们可以发现一点:既然可以得到iframe内容的body对象,就可以得到bodyinnerHTML!这样我们可以再加入一个div或者span标签,把body对象的innerHTML复制到divinnerHTML中。利用div的高度自适应,加上iframe的异步请求和编码不敏感的特性,就可以达到一个很好的效果。

JavaScript代码:

 1 function LoadContent(src, iframeID) {
 2        var content = document.getElementById(iframeID);
 3        content.setAttribute('src', src);
 4 }
 5  
 6 function swipContent(src, to) {
 7        document.getElementById(to).innerHTML = getIFrameContent(src);
 8 }
 9  
10 function getIFrameContent(id){
11        var bobo=document.getElementById(id); //iframe id
12        if (document.getElementById){
13               if (bobo && !window.opera){
14                      if (bobo.contentDocument){
15                             return bobo.contentDocument.body.innerHTML;
16                      }else if(bobo.Document){
17                             return bobo.Document.body.innerHTML;
18                      }
19               }
20        }
21 }

 

HTML的代码:

1 <href=”#” onclick=”LoadContent(‘URL’, ‘icontent’)”>Link Button</a>
2 <iframe id=”icontent” width="600" height="0" scrolling="auto" frameborder="0"
3     onload="swipContent('icontent', 'dest')"></iframe>
4 <div id=”dest” />

    随着UTF-8编码的逐渐流行,这种“绕圈子”的方法的用武之地就逐渐变少了。而随着找到解决方法的这一连串的过程至少给了我一个启示:有时候换个思路就好多了。如果在寻找iframe的高度自适应功能上,仅仅只盯住scrollHeight就会花费更多的时间而且找不到好的办法。而跳出iframe,换一种思路:把iframe当作一个Ajax引擎来实现异步调用的功能,就是另一片天地了。

    在最后,也顺便说说,这种方法的问题:如果在iframe请求的页面中使用了主页面中未定义的CSS样式,那么上面这个移花接木的方法就会出现显示问题。至于解决方法,就是把iframe中的页面的CSS导入到主页面中。