django系统学习笔记

转自:http://hi.baidu.com/derris/item/7ca6013e330563fede2221ab

2010-02-07 00:12

django系统学习笔记~~(1)hello world

强烈推荐 djangoz教程 中文版 http://djangobook.py3k.cn/2.0/

按照手册的指导(http://www.djangobook.com/en/2.0/chapter02/) 安装python和django

python :下载2.6就可以:http://www.python.org/download/ 直接下载windows版本。

django:下载1.1就可以:http://www.djangoproject.com/download/. 然后运行:python setup.py install

把python目录下面的:Lib\site-packages\django\bin加入到路径里面。

创建一个django的web框架,生成一堆文件。

django-admin.py startproject mysite

mysite/
    __init__.py
    manage.py
    settings.py
    urls.py

进入到mysite目录中,运行web测试服务器:

python manage.py runserver

提示在 http://127.0.0.1:8000/ 运行啦,可以访问一下看看。系统自动提示:It worked!

现在可以添加一些内容了:创建一个空的文件,起名为:views.py,里面加入内容:

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello mysite!")

更改urls.py的内容为:

from django.conf.urls.defaults import *
from mysite.views import hello

urlpatterns = patterns('',
   ('^$', hello)
)

#正则表达式参考:http://hi.baidu.com/derris/blog/item/fe5dea17ef90dd02c83d6df1.html

再访问:http://127.0.0.1:8000/ ,内容变了~~

当浏览器访问: http://127.0.0.1:8000/时,django访问settings文件.
当启动django的web服务器:python manage.py runserver时,django在manage.py所在的目录里面找到文件:settings.py。这个文件包括了所有项目需要的配置文件TEMPLATE_DIRS, DATABASE_NAME,等等。最重要的设置就是ROOT_URLCONF.(ROOT_URLCONF = 'mysite.urls')他告诉django那个模块用作网站文件。ROOT_URLCONF = 'mysite.urls'指向的就是mysite/urls.py文件。再按照urls.py里面的对应正则表达式找到对应的方法处理。具体步骤如下:

1 Django在网站端口得到一个请求/hello/。
2 Django根据ROOT_URLCONF的指向,找到配置文件。
3 Django搜索符合/hello/的patter选项。
4 找到符合选项对应的处理方法,运行该方法。
5 该方法返回HttpResponse。
6 Django将HttpResponse转换为HTTP文档发给请求方。

django系统学习笔记 ~~(2) 动态参数
http://hi.baidu.com/derris/blog/item/dceec6ddbaac2ae477c638c0.html
 
 
 

django系统学习笔记~~(2)动态参数

(1) http://hi.baidu.com/derris/blog/item/f6185a31ed2c1212eac4af05.html
(3) http://hi.baidu.com/derris/blog/item/635cca5007857d571138c2f2.html

显示动态变化的内容:

更改 views.py 文件:

from django.http import HttpResponse
import datetime

def hello(request):
    return HttpResponse("Hello world")

def current_datetime(request):
    now = datetime.datetime.now()
    html = "It is now %s." % now
    return HttpResponse(html)

urls.py 文件如下:

from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime

urlpatterns = patterns('',
    ('^hello/$', hello),
    ('^time/$', current_datetime),
)

再访问 http://127.0.0.1:8000/time/,就会显示当前的时间。

假设我们想根据1个参数返回一个时差,比如东京和北京的时间就不同。比如我们这样
urlpatterns = patterns('',
    ('^time/$', current_datetime),
    ('^time/plus/1/$', one_hour_ahead),
    ('^time/plus/2/$', two_hours_ahead),
    ('^time/plus/3/$', three_hours_ahead),
    ('^time/plus/4/$', four_hours_ahead),
)
太多了,最好有个参数。

urls.py 文件如下:
from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime, hours_ahead

urlpatterns = patterns('',
    (r'^hello/$', hello),
    (r'^time/$', current_datetime),
    (r'^time/plus/(\d{1,2})/$', hours_ahead),
)
更改 views.py 文件:
from django.http import Http404, HttpResponse
import datetime

def hours_ahead(request, offset):
    try:
        offset = int(offset)
    except ValueError:
        raise Http404()
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    html = "In %s hour(s), it will be %s." % (offset, dt)
    return HttpResponse(html)

def hello(request):
    return HttpResponse("Hello mysite!")

def current_datetime(request):
    now = datetime.datetime.now()
    html = "It is now %s." % now
    return HttpResponse(html)

访问:http://127.0.0.1:8000/time/plus/4/ 发现可以按照接收的参数进行动态的调整了。

 
 
2010-02-19 14:53

django系统学习笔记~~(3)模板

(2)http://hi.baidu.com/derris/blog/item/dceec6ddbaac2ae477c638c0.html
(4)http://hi.baidu.com/derris/blog/item/8cb9a635bf795b1a91ef39ef.html

每次更改显示的内容,就需要重新编码,最好通过模板将内容和表现分开,这样可以有人专门做程序,有人专门做设计。

在当前目录里面增加一个文件:current_datetime.html,内容如下:


It is now {{ current_date }}. and i can change the content freely.

随便加什么乱七八糟的都行



{{ current_date }}是一个等待传递过来内容的变量。还有可以用的语句后面再说。

更改view.py如下:
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime

def hours_ahead(request, offset):
    try:
        offset = int(offset)
    except ValueError:
        raise Http404()
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    html = "In %s hour(s), it will be %s." % (offset, dt)
    return HttpResponse(html)


def hello(request):
    return HttpResponse("Hello mysite!")

from django.shortcuts import render_to_response

def current_datetime(request):
    now = datetime.datetime.now()
    return render_to_response('current_datetime.html', {'current_date': now})

再更改setting.py中的TEMPLATE_DIRS项目,指定模板所在的目录。我们在根目录下,就可以改为:
TEMPLATE_DIRS = (
    unicode(os.path.dirname(__file__), 'gbk'),
)

unicode的问题是因为我把他放在中文目录下面了,必须要转一下,否则utf8的编码解码不了中文

然后访问:http://127.0.0.1:8000/time/ 就可以显示了~~

render_to_response是快捷的实现方法,也相当于:

def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

比这个写法简单多了,还有一个简单的代替上下文参数的方法,就是用locals(),自动将当前本地范围变量封装为上下文参数。下面locals就代替now了,不过一定要记住,变量名字和上下文字典的主键要一致。还有locals也会包含参数request,所以会造成一定的数据膨胀~

def current_datetime(request):
    current_date = datetime.datetime.now()
    return render_to_response('current_datetime.html', locals())

关于模板的一些说明:

模板文件可以使用 {% include 'nav.html' %} 来包含一些通用的东东。

创建一个文件:base.html内容如下:

{% block title %}{% endblock %}

   

My test base template


    {% block content %}{% endblock %}
    {% block footer %}
   

   

Thanks for visiting my site.


    {% endblock %}

还可以用 {% block name %} {% endblock %} 在定义基类的块,通过{% extends "base.html" %} 来继承 base.html 的内容,然后系统会根据子网页的数据内容来替换base.html中定义的块,达到继承扩展的效果。:) 如果子网页对于某些块没有定义,那么会沿用base.html中的内容。子模板如下:

{% extends "base.html" %}

{% block title %}The current time{% endblock %}

{% block content %}

It is now {{ current_date }}.


{% endblock %}

模板中尽量不要包括什么逻辑,逻辑应该做到外面去,主要模板的语句是
{{变量、类、方法都可以}}
{% 语句   %} :if , else, endif, for, empty, endfor, ifequal, else, endifequal, comment, endcomment
{{变量}}:forloop.counter(当前是第几个), forloop.first(是否是第一个), forloop.revcounter(还剩几个), forloop.revcounter0, forloop.last(是否是最后一个), forloop.parentloop,
{# line comment #}
过滤器:{{ my_list|first|upper }} mylist里面的第一个,大写
{{ astring | truncatewords:"30" }} 还可以给方法带参数,范围前30个字符。
{{ adate | date:"F j, Y"}} 给日期指定格式。

详细教程地址:http://www.djangobook.com/en/2.0/chapter04/

 
 
 
2010-02-19 21:47

django系统学习笔记~~(4)模型和数据操作

(3)http://hi.baidu.com/derris/blog/item/635cca5007857d571138c2f2.html
(5)http://hi.baidu.com/derris/blog/item/80e8eb956b0b1240d0135e4b.html

mvc或者说是mtv模式,主要为了让数据模型、业务逻辑、表现逻辑尽量的分离,实现松散耦合。

这次学习是一个新的例子,在以前的mysite目录里面增加一个books的应用,进入mysite目录,执行:

python manage.py startapp books

创建了一个目录,books,里面有一些空文件:)

books/
    __init__.py
    models.py
    tests.py
    views.py

首先编辑models.py

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()
    def __unicode__(self):
        return self.name
    class Meta:
         ordering = ['name']

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()
    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    def __unicode__(self):
        return self.title

再编辑mysite下面的文件:settings.py:

找到INSTALLED_APPS 这里,更改为:
INSTALLED_APPS = (
    # 'django.contrib.auth',
    # 'django.contrib.contenttypes',
    # 'django.contrib.sessions',
    # 'django.contrib.sites',
    'mysite.books',
)

在mysite目录下运行:python manage.py validate
0 errors found 就可以了。

下面要配置数据库了,在setting.py文件里面。找到对应的地方更改如下:

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'c:/mydata.db'   # change it free

测试一下:运行:
python manage.py shell
>>>from django.db import connection
>>>cursor = connection.cursor()

没有错误就ok了,否则根据错误提示调试一下

运行python manage.py syncdb
将模型同步到数据库中。
Creating table books_publisher    
Creating table books_author      
Creating table books_book
Installing index for books.Book model

生成的数据注意都是小写,引用的时候要注意啊。。。

常用语句说明:首先准备数据。
>>> from books.models import Publisher
插入数据
>>> p1 = Publisher.objects.create(name='Apress',
...     address='2855 Telegraph Avenue',
...     city='Berkeley', state_province='CA', country='U.S.A.',
...     website='http://www.apress.com/')
>>> p1.save()
更新数据
>>> p1.name = 'Apress Publishing'
>>> p1.save()
>>> Publisher.objects.all().update(country='USA')

查找/选择数据
>>> Publisher.objects.filter(name='Apress')
>>> Publisher.objects.filter(country="U.S.A.", state_province="CA") # and 双条件
>>> from django.db.models import Q
>>> Publisher.objects.filter(Q(name='Apress') | Q(name='newone'))   # or 条件
>>> Publisher.objects.filter(name__contains="press")    # 模糊查找,相当于name like '%press%'
排序数据,类似的还有加下双划线icontains (不区分大小写的like), startswith、endswithrange (SQL BETWEEN语句等).
>>> Publisher.objects.order_by("name") # 到排序用-name
综合
>>> Publisher.objects.filter(country="U.S.A.").order_by("-name")
删除数据
>>> p = Publisher.objects.get(name="O'Reilly")
>>> p.delete()
>>> Publisher.objects.filter(country='USA').delete()

执行自定义SQL
在自定义 model 方法和模块级方法里,你可以自由的执行自定义SQL语句. 对象 django.db.connection 表示当前的数据库连接. 调用 connection.cursor() 得到一个游标对象. 然后调用 cursor.execute(sql, [params])``以执行 SQL 语句, 使用 ``cursor.fetchone() 或 cursor.fetchall() 得到结果集. 下面是一个例子:


    from django.db import connection
    cursor = connection.cursor()
    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
    row = cursor.fetchone()

如果你的SQL语句改变了数据库中的数据 -- 比如你使用了 DELETE 或 UPDATE 语句. 你需要调用 connection.commit() 来使你的修改生效. 例子:

    from django.db import connection
    cursor = connection.cursor()
    cursor.execute("DELETE FROM bar WHERE baz = %s", [self.baz])
    connection.commit()
connection 和 cursor 直接调用 Python DB-API. 如果你对 Python DB-API 不熟悉, 注意``cursor.execute()`` 中的SQL语句使用了占位符 "%s", 这比直接在 SQL语句中指定参数要灵活. 如果你使用此技术, 后台的数据库会自动的在需要时用引号引并转义你的参数.

最后提醒一下: 如果你想要的仅仅是一个自定义的 WHERE 子句,你可以在标准查询 API 中通过指定 where, tables 和 params 参数来完成同样的功能.参阅 其它查询选项.

在dos下运行:python manage.py sqlall books
会列出所有的sql语句。

注意:
CREATE TABLE "books_book_authors" (
    "id" integer NOT NULL PRIMARY KEY,
    "book_id" integer NOT NULL REFERENCES "books_book" ("id"),
    "author_id" integer NOT NULL REFERENCES "books_author" ("id"),
    UNIQUE ("book_id", "author_id")
)
;   # 这个是因为多对多产生的一个中间表。
CREATE INDEX "books_book_publisher_id" ON "books_book" ("publisher_id");
外键产生一个索引,对应publisher的id。book中publisher字段存的是一个id值。

将常用的业务逻辑写到特定的模型中也是一个比较不错的封装方法:

from django.db import models

class DahlBookManager(models.Manager):
    def get_query_set(self):
        return super(DahlBookManager, self).get_query_set().filter(author='Roald Dahl')

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    # ...
    objects = models.Manager() # The default manager.
    dahl_objects = DahlBookManager() # The Dahl-specific manager.

 
 

django系统学习笔记~~(5)admin系统管理 数据和用户

(4)http://hi.baidu.com/derris/blog/item/8cb9a635bf795b1a91ef39ef.html
(6)http://hi.baidu.com/derris/blog/item/e8ee10fafd711915a9d31185.html

通过admin模块来进行数据的后台管理和用户控制。

进入mysite目录,编辑settings.py文件:找到
INSTALLED_APPS 编辑为:

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

如果需要本地化为当地语言,增加'django.middleware.locale.LocaleMiddleware',到MIDDLEWARE_CLASSES的设置里面,确保增加在'django.contrib.sessions.middleware.SessionMiddleware'后面就可以了。

编辑urls.py文件为如下内容:
from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime, hours_ahead
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
('^$', hello),
('^hello/$', hello),
('^time/$', current_datetime),
(r'^time/plus/(\d{1,2})/$', hours_ahead),
(r'^admin/', include(admin.site.urls)),
)
搞定。在dos下运行python manage.py syncdb,同步数据库以后访问:http://127.0.0.1:8000/admin/ 可以用设置的用户和密码登录了。
如果没有选择创建系统管理员账户,可以用python manage.py createsuperuser命令创建用户。
目前因为没有指定admin管理的内容,所以admin登录进去只能进行系统的用户和组设置。下面把我们的books系统表增加到里面:
在目录mysite/books里面增加admin.py,内容为:
from django.contrib import admin
from mysite.books.models import Publisher, Author, Book

admin.site.register(Publisher)
admin.site.register(Author)
admin.site.register(Book)

现在可以对这3个表的所有信息进行编辑了,所有的字段默认都不允许为空。

下面考虑一些字段的具体选项,比如那些字段可以为空,以及显示格式等。关于字段可空的选项主要在模型后面增加选项,因为django默认所有的数据库都不可以为null。

对于字符类型来说增加blank=True就可以了,django会自动插入None作为数据库空值。对于数字和日期等,必须允许数据库为null。这样需要设置选项为:blank=True, null=True。

如果在模型中增加了null=True的选项,django不会自动同步到数据库中,需要手工进行设置
>>> import sqlite3
>>> conn = sqlite3.connect('c:\\mydata.db')
>>> cur = conn.cursor()
>>> cur.execute("drop TABLE books_book;")
然后再同步数据库
python manage.py syncdb
最好全部删除了数据库文件,重新执行,否则有重复报错,不过也无所谓了。最多有些垃圾数据。
sqlite3的具体sql文档见:http://www.sqlite.org/lang.html
列出所有的sqlite3中的表:
>>> cur.execute("SELECT name FROM sqlite_master where type='table'")
>>> for a in cur :
...     print a

--------------------- 如果需要更新列,sqlite3不支持删除列的。只能备份数据后,再搞进去

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a);
INSERT INTO t1 SELECT a FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;
-----------------------------------
在amdin对表记录进行列表选择的时候,默认列出的是__unicode__定义的内容,如果想对字段进行详细设置,更改admin.py如下:

from django.contrib import admin
from mysite.books.models import Publisher, Author, Book

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'email') # 设置选择某表列出的内容
    search_fields = ('first_name','last_name', 'email') # 设置是否有搜索框,搜索的内容包含哪些字段。

class BookAdmin(admin.ModelAdmin):
    list_display = ('title','publisher', 'publication_date')
    ordering = ('-publication_date',)                                      # 显示的排序字段
    fields = ('title', 'authors', 'publisher', 'publication_date')   # 列出可以编辑的字段
    filter_horizontal = ('authors',)                                          # 水平显示一个可以选择的列表框
    raw_id_fields = ('publisher',)                                           # 录入出版商对应的号码。

admin.site.register(Publisher)
admin.site.register(Author, AuthorAdmin)
admin.site.register(Book, BookAdmin)

可以看到列出的格式和内容都发生了变化。

-------------------------------------------------------------------------------------------------常用查询

生成的所有表中自动追加一个id字段

CREATE TABLE "books_publisher" (   "id" serial NOT NULL PRIMARY KEY,……

ManyToMany的字段将不会再表中生成,而是自动生成一个中间表,储存2个表的主键对应。

publication_date = models.DateField(blank=True, null=True, verbose_name='显示标签名' )

在类中定义列表的显示内容。

    def __unicode__(self):

        return u'%s %s' % (self.first_name, self.last_name)

from django.contrib import admin

from mysite.books.models import Publisher, Author, Book

class xxxAdmin(admin.ModelAdmin):

    list_display = ('first_name', 'last_name', 'email')

    search_fields = ('first_name', 'last_name')

list_filter = (' first_name ',)              快速选择数据

date_hierarchy = 'publication_date'

ordering = ('-publication_date',)

fields = ('title', 'authors', 'publisher', 'publication_date') 字段显示顺序

filter_horizontal = ('authors',)   多对多选择用。filter_vertical

raw_id_fields = ('publisher',)    外键选择不用太慢把全部数据加载到下拉列表中,

admin.site.register(Author, AuthorAdmin)

 
 

django系统学习笔记~~(6)表单

(5)http://hi.baidu.com/derris/blog/item/80e8eb956b0b1240d0135e4b.html
(7)http://hi.baidu.com/derris/blog/item/8883efbf1d0c470118d81f10.html

先显示一下http的访问格式。在mysite目录里面的views.py最后增加一段显示代码

def display_meta(request):
    html = []     
    for i in [ 'GET', 'REQUEST', 'POST', 'COOKIES', 'FILES', 'META']:       
        html.append('------%s---------' % i)
        values = eval("request.%s" % i)       
        if not isinstance(values, str):
            valuex = values.items()
            for k, v in valuex:
                html.append('%s%s' % (k, v))
    return HttpResponse('

%s
' % '\n'.join(html))

在urls.py中,编辑如下:

from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime, hours_ahead, display_meta
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    ('^$', hello),
    ('^hello/$', hello),
    ('^time/$', current_datetime),
    (r'^time/plus/(\d{1,2})/$', hours_ahead),
    (r'^admin/', include(admin.site.urls)),
    (r'^look/$', display_meta),
)
然后访问:
http://127.0.0.1:8000/look/   看到列出了一堆。。。。

下面开始使用form了,在mysite下面建立一个search_form.html文件,内容如下:



    Search


   


       
       
   

urls.py变更如下:

from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime, hours_ahead, display_meta
from django.contrib import admin
from mysite import views
admin.autodiscover()

urlpatterns = patterns('',
    ('^$', hello),
    ('^hello/$', hello),
    ('^time/$', current_datetime),
    (r'^time/plus/(\d{1,2})/$', hours_ahead),
    (r'^admin/', include(admin.site.urls)),
    (r'^look/$', display_meta),
    (r'^look/$', display_meta),
    (r'^search_form/$', views.search_form),
)
mysite的views.py中增加对应的处理

def search_form(request):
    return render_to_response('search_form.html')

然后访问:http://127.0.0.1:8000/search_form/ 录入一下查找,又看到列出了一堆,其中get和REQUEST下面有一列,变量q,内容就是你输入的数据...如果把search_form.html里面的form提交方法更改为post,那么就在post和REQUEST下面出现你提交的数据。

数据看明白了,把search_form.html里面表单的form提交对象更改成search,继续做例子

建立一个搜索结果的反馈模板文件:search_results.html

You searched for: {{ query }}



{% if books %}
   

Found {{ books|length }} book{{ books|pluralize }}.


   

            {% for book in books %}
           
  • {{ book.title }}

  •         {% endfor %}
       

{% else %}
   

No books matched your search criteria.


{% endif %}
注意:books|pluralize 会根据books大于1个自动加一个s,变成复数:)

urls.py中增加对应的处理
(r'^search/$', views.search),

views.py中增加对应的方法:
from mysite.books.models import Book
def search(request):
    if 'q' in request.GET and request.GET['q']:
        q = request.GET['q']
        books = Book.objects.filter(title__icontains=q)
        return render_to_response('search_results.html',
            {'books': books, 'query': q})
    else:
        return HttpResponse('Please submit a search term.')

现在,可以访问http://127.0.0.1:8000/search_form/ 输入书名就可以查询了。

因为如果输入空提交我们是直接return HttpResponse('Please submit a search term.'),造成需要回退才可以再次输入,为了提高服务质量,最好能够在同一个页面里面提示,可以直接再次查询。这样把最后一句return HttpResponse的改为:
return render_to_response('search_form.html', {'error': True})
再更新一下'search_form.html'文件



    Search


    {% if error %}
       

Please submit a search term.


    {% endif %}
   
       
       
   


现在发现search_form已经不需要访问了。直接访问search只是多一个空提示,更改程序如下,search_form方法就可以完全淘汰了(search_form.html还要留着哈)。
def search(request):
    error = False
    if 'q' in request.GET:
        q = request.GET['q']
        if not q:
            error = True
        else:
            books = Book.objects.filter(title__icontains=q)
            return render_to_response('search_results.html',
                {'books': books, 'query': q})
    return render_to_response('search_form.html',
        {'error': error})

error 目前只是一个字符串的变量,可以更改为列表,一次提示出来所有的错误。

按照上面的方式,如果字段非常多,需要很多的判断和错误提示,非常麻烦。django提供我们一些更好的模板来处理他~~

先做一个简单表单,包括3个字段:标题,内容,Email。在mysite目录里面创建一个目录contact,建立一个forms.py文件:

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    email = forms.EmailField(required=False, label='Your e-mail address')
    message = forms.CharField(widget=forms.Textarea)
    def clean_message(self):
        message = self.cleaned_data['message']
        num_words = len(message.split())
        if num_words < 4:
            raise forms.ValidationError("Not enough words!")
        return message

Django系统自动查找clean_开头,并且后面的名字是其中字段的方法,在系统的验证完后作为用户验证运行。forms.ValidationError的内容自动加载到字段错误中。

在mysite目录的views.py文件中增加:

from mysite.contact.forms import ContactForm
def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            send_mail(
                cd['subject'],
                cd['message'],
                cd.get('email', '[email protected]'),
                ['[email protected]'],
            )
            return HttpResponse("thanks visit mysite!")
    else:
        form = ContactForm(initial={'subject': 'I love your site!'})
    return render_to_response('contact_form.html', {'form': form})

在mysite里面创建一个模板文件:contact_form.html


    Contact us


   

Contact us



    {% if form.errors %}
       


            Please correct the error{{ form.errors|pluralize }} below.
       


    {% endif %}

   

       
            {{ form.as_table }}
       

       
   


在urls.py文件里面增加一行引用:
    (r'^contact/$', views.contact),

在contact目录里面需要增加一个__init__.py的空文件,不然提示import错误。

send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None)

如果要成功发送email,需要在setting.py里面增加如下设置。

EMAIL_HOST = "smtp.163.com"
EMAIL_HOST_PASSWORD = "xxxxxxx"
EMAIL_HOST_USER = "yourname"
EMAIL_PORT = "25"

关于form类的理解,自动生成各种需要的语法:

>>> from contact.forms import ContactForm
>>> f = ContactForm()
>>> print f


>>> print f.as_ul()
  • >>> print f.as_p()

    >>> print f['subject']

    >>> print f['message']

    >>> f = ContactForm({'subject': 'Hello', 'email': '[email protected]', 'message': 'Nice site!'})

    一旦你关联上数据以后,就创建了一个基础form,判断:

    >>> f.is_boundTrue

    检查合法性:

    >>> f.is_valid()True

    如果有不和逻辑的,比如非空字段没有填写等,is_valid()就返回False,可以通过具体引用返回错误。
    >>> f = ContactForm({'subject': 'Hello', 'message': ''})
    >>> f['message'].errors
    [u'This field is required.']
    >>> f['subject'].errors
    []
    >>> f['email'].errors
    []
    >>> f.errors
    {'message': [u'This field is required.']}
    >>> f.cleaned_data
    {‘message’: u’Nice site!’, ‘email’: u’[email protected]’, ‘subject’: u’Hello’}
    cleaned_data用于将文本转换成python对应的具体数据类型,如数字、文本、日期等。

    可以用css方便的对自动生成的html进行格式定义,只要根据生成的源代码进行修饰就可以了~!

    详见:http://www.djangobook.com/en/2.0/chapter07/

     
     

    django系统学习笔记~~(7)高级视图和URL配置

    (6)http://hi.baidu.com/derris/blog/item/e8ee10fafd711915a9d31185.html
    (8)http://hi.baidu.com/derris/blog/item/f490f213dc314f095baf53cc.html

    urls.py文件中提供的入口函数导入格式,相对复杂。

    from django.conf.urls.defaults import *
    from mysite.views import hello, current_datetime, hours_ahead

    urlpatterns = patterns('',
        (r'^hello/$', hello),
        (r'^time/$', current_datetime),
        (r'^time/plus/(\d{1,2})/$', hours_ahead),
    )

    有一种相对简洁的写法,这样起码不用再写2边:
    from mysite import views
    urlpatterns = patterns('',
        (r'^hello/$', views.hello),
        (r'^time/$', views.current_datetime),
        (r'^time/plus/(d{1,2})/$', views.hours_ahead),
    )

    甚至不用模块导入直接写,但是必须要声明为字符串,。
    from django.conf.urls.defaults import *
    urlpatterns = patterns('',
        (r'^hello/$', 'mysite.views.hello'),
        (r'^time/$', 'mysite.views.current_datetime'),
        (r'^time/plus/(d{1,2})/$', 'mysite.views.hours_ahead'),
    )
    还可以更好的处理一下,在第一个参数中声明好导入模块。
    from django.conf.urls.defaults import *
    urlpatterns = patterns('mysite.views',
        (r'^hello/$', 'hello'),
        (r'^time/$', 'current_datetime'),
        (r'^time/plus/(d{1,2})/$', 'hours_ahead'),
    )

    如果从不同的模块导入,可以分开累加urlpatterns
    from django.conf.urls.defaults import *
    urlpatterns = patterns('mysite.views',
        (r'^hello/$', 'hello'),
        (r'^time/$', 'current_datetime'),
        (r'^time/plus/(\d{1,2})/$', 'hours_ahead'),
    )
    urlpatterns += patterns('weblog.views',
        (r'^tag/(\w+)/$', 'tag'),
    )

    可以声明调试模式,提供一些参数信息:

    from django.conf import settings
    from django.conf.urls.defaults import *
    from mysite import views
    urlpatterns = patterns('',
        (r'^$', views.homepage),
        (r'^(\d{4})/([a-z]{3})/$', views.archive_month),
    )
    if settings.DEBUG:
        urlpatterns += patterns('',
            (r'^debuginfo/$', views.debug),
        )

    django自动根据正则表达式匹配对应的函数调用,对于函数参数,有2种传递方式:
    按顺序的匿名参数传递和指定参数名字的传递方式,如:
    urlpatterns = patterns('',
        (r'^articles/(\d{4})/$', views.year_archive),
        (r'^articles/(\d{4})/(\d{2})/$', views.month_archive),
    ) 产生函数调用:month_archive(request, '2006', '03')

    urlpatterns = patterns('',
        (r'^articles/(?P\d{4})/$', views.year_archive),
        (r'^articles/(?P\d{4})/(?P\d{2})/$', views.month_archive),
    ) 产生函数调用:month_archive(request, year='2006', month='03')
    注意在同一个模式中是不能2者混用的。

    urlpattern甚至能够传递一个字典参数:
    urlpatterns = patterns('',
        (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
        (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
    )
    这样对应的处理。注意参数名字和字典的主键必须一致起来就可以,参数类型可以任意。最好加上参数的默认值,就会灵活很多。
    def foobar_view(request, template_name=‘default’):
        m_list = MyModel.objects.filter(is_new=True)
        return render_to_response(template_name, {'m_list': m_list})

    注意:参数的数值优先于patter匹配的数值,就是说,比如
    在(r'^mydata/(?P\d+)/$', views.my_view, {'id': 3})看来,
    对于/mydata/2/ 或者 /mydata/432432/) id这个变量都会为3。
    模式匹配是有优先原则的,就是django会按照第一个能匹配的进行处理。

    这样我们就可以写一个几乎能适应所有情况的一个固定模式的view处理函数:

    # urls.py文件

    from django.conf.urls.defaults import *
    from mysite import models, views
    urlpatterns = patterns('',
        (r'^events/$', views.object_list, {'model': models.Event}),
        (r'^blog/entries/$', views.object_list, {'model': models.BlogEntry}),
    )
    # views.py文件

    from django.shortcuts import render_to_response
    def object_list(request, model):
        obj_list = model.objects.all()
        template_name = 'mysite/%s_list.html' % model.__name__.lower()
        return render_to_response(template_name, {'object_list': obj_list})
    这样只要编辑好对应的model就可以了~!然后需要改动的只有urls.py文件和对应的模型,在views中的处理都是一样的。
    由于request的请求一般分为post和get的,而且会有跟着参数,我们写一个比较通用的处理函数:# views.py

    from django.http import Http404, HttpResponseRedirect
    from django.shortcuts import render_to_response

    def method_splitter(request, *args, **kwargs):
        get_view = kwargs.pop('GET', None)
        post_view = kwargs.pop('POST', None)
        if request.method == 'GET' and get_view is not None:
            return get_view(request, *args, **kwargs)
        elif request.method == 'POST' and post_view is not None:
            return post_view(request, *args, **kwargs)
        raise Http404

    def some_page_get(request):
        assert request.method == 'GET'
        do_something_for_get()
        return render_to_response('page.html')

    def some_page_post(request):
        assert request.method == 'POST'
        do_something_for_post()
        return HttpResponseRedirect('/someurl/')

    # urls.py

    from django.conf.urls.defaults import *
    from mysite import views

    urlpatterns = patterns('',
        # ...
        (r'^somepage/$', views.method_splitter, {'GET': views.some_page_get, 'POST': views.some_page_post}),
        # ...
    )
    参数*args和和**kwargs(注意*号) 这是一个Python特性,允许函数接受动态的、可变数量的、参数名只在运行时可知的参数。 如果你在函数定义时,只在参数前面加一个*号,所有传递给函数的参数将会保存为一个元组. 如果你在函数定义时,在参数前面加两个*号,所有传递给函数的关键字参数,将会保存为一个字典
    最后处理一个重复代码的例子:假设每个函数都要验证用户,我们这样处理一下就好了:
    def requires_login(view):
        def new_view(request, *args, **kwargs):
            if not request.user.is_authenticated():
                return HttpResponseRedirect('/accounts/login/')
            return view(request, *args, **kwargs)
        return new_view
    函数requires_login,传入一个视图函数view,然后返回一个新的视图函数new_view.这个新的视图函数new_view在函数requires_login内定义 处理request.user.is_authenticated()这个验证,从而决定是否执行原来的view函数 from django.conf.urls.defaults import *
    from mysite.views import requires_login, my_view1, my_view2, my_view3

    urlpatterns = patterns('',
        (r'^view1/$', requires_login(my_view1)),
        (r'^view2/$', requires_login(my_view2)),
        (r'^view3/$', requires_login(my_view3)),
    )

    关于url的包含可以写的更具有模块性一点,比如前面我们学的amdin模块的添加。如:

    urlpatterns = patterns('',
        (r'^weblog/', include('mysite.blog.urls')),
        (r'^photos/', include('mysite.photos.urls')),
        (r'^about/$', 'mysite.views.about'),
    )
    他会根据指定目录下面对应方法进行处理。如(r'^admin/', include(admin.site.urls)),碰到admin,django会截断后面的内容,发送给admin.site.urls方法中对应的pattern进行处理。

    最后注意的是inlcude包含在父urls捕获的变量或者声明的变量,会自动传递给所有的下级视图处理函数。不处理也可以~~

     
     
     

    django系统学习笔记~~(8)模板的高级用法~~

    (7)http://hi.baidu.com/derris/blog/item/8883efbf1d0c470118d81f10.html
    (9)http://hi.baidu.com/derris/blog/item/c0fe9f31140fd5a35fdf0e32.html

    django除了context还有一个django.template.RequestContext 默认地在模板context中加入了一些变量

    from django.shortcuts import render_to_response
    from django.template import RequestContext

    def custom_proc(request):
        "A context processor that provides 'app', 'user' and 'ip_address'."
        return {
            'app': 'My app',
            'user': request.user,
            'ip_address': request.META['REMOTE_ADDR']
        }

    def view_1(request):
        # ...
        return render_to_response('template1.html',
            {'message': 'I am view 1.'},
            context_instance=RequestContext(request, processors=[custom_proc]))

    def view_2(request):
        # ...
        return render_to_response('template2.html',
            {'message': 'I am the second view.'},
            context_instance=RequestContext(request, processors=[custom_proc]))

    一, RequestContext 的第一个参数需要传递一个 HttpRequest 对象,就是传递给视图函数的第一个参数( request )。二, RequestContext 有一个可选的参数 processors ,这是一个包含context处理器函数的list或者tuple。 在这里,我们传递了我们之前定义的函数 curstom_proc 。

    每次都写 processors=[] 似乎很麻烦,django提供一个默认的设置:
    TEMPLATE_CONTEXT_PROCESSORS = (
        'django.core.context_processors.auth',
        'django.core.context_processors.debug',
        'django.core.context_processors.i18n',
        'django.core.context_processors.media',
    )

    这样我们测试一下:在mysite目录下面的settings.py增加
    TEMPLATE_CONTEXT_PROCESSORS = (
        'django.core.context_processors.auth',
        'django.core.context_processors.debug',
        'django.core.context_processors.i18n',
        'django.core.context_processors.media',
    )
    在views.py中增加一个测试模板:
    def test(request):
        return render_to_response('test.html',{'app': 'I am a test view'},
            context_instance=RequestContext(request ) )
    urls.py中增加对应的处理
        (r'^test/$', views.test),
    增加一个test.html的文件模板:

       

    test


      

       app is -> {{ app }}
      

       user is -> {{ user }}
      


       LANGUAGES    is -> {{ LANGUAGES    }}  

    访问:
    http://127.0.0.1:8000/test/ 可以看到,我们只传递了app参数,但是user, LANGUAGES也可以用了。

    具体默认参数如下:
    django.core.context_processors.auth
    user :一个 django.contrib.auth.models.User 实例,描述了当前登录用户(或者一个 AnonymousUser 实例,如果客户端没有登录)。
    messages :一个当前登录用户的消息列表(字符串)。 在后台,对每一个请求这个变量都调用 request.user.get_and_delete_messages() 方法。 这个方法收集用户的消息然后把它们从数据库中删除。
    perms : django.core.context_processors.PermWrapper 的一个实例,包含了当前登录用户有哪些权限。

    django.core.context_processors.debug
    debug :你设置的 DEBUG 的值( True 或 False )。你可以在模板里面用这个变量测试是否处在debug模式下。
    sql_queries :包含类似于 ``{‘sql’: …, ‘time’: `` 的字典的一个列表, 记录了这个请求期间的每个SQL查询以及查询所耗费的时间。 这个列表是按照请求顺序进行排列的。
    由于调试信息比较敏感,所以这个context处理器只有当同时满足下面两个条件的时候才有效:
    DEBUG 参数设置为 True 。
    请求的ip应该包含在 INTERNAL_IPS 的设置里面。

    django.core.context_processors.i18n如果这个处理器启用,每个 RequestContext 将包含下面的变量:
    LANGUAGES : LANGUAGES 选项的值。
    LANGUAGE_CODE :如果 request.LANGUAGE_CODE 存在,就等于它;否则,等同于 LANGUAGE_CODE 设置。
    附录E提供了有关这两个设置的更多的信息。

    django.core.context_processors.request如果启用这个处理器,每个 RequestContext 将包含变量 request , 也就是当前的 HttpRequest 对象。 注意这个处理器默认是不启用的,你需要激活它。
    如果你发现你的模板需要访问当前的HttpRequest你就需要使用它:
    {{ request.REMOTE_ADDR }}

    你也可以写自己的processors,只要包含进去就可以了。

    html语法的转意,比如变量里面如果存在script语句就会很危险~django默认给所有的语法相关的东东都自动转义了,比如<号转为:<等
    可以有2种方法进行控制
    This will be escaped: {{ data }}
    This will not be escaped: {{ data|safe }}
    --------------------------------------------
    This will be escaped: <b>
    This will not be escaped:

    还可以成块的注释:
    {% autoescape off %}
        Hello {{ name }}
    {% endautoescape %}
    ---------

    对于变量的复制是不受过滤的,因为是受控语句复制的。所以可以信任。
    如 {{ data|default:"This is a string literal." }}, 是不会过滤的。

    默认情况下这些函数使用 TEMPLATE_DIRS 的设置来载入模板。

    Django有两种方法加载模板
    django.template.loader.get_template(template_name) : get_template 根据给定的模板名称返回一个已编译的模板(一个 Template 对象)。 如果模板不存在,就触发 TemplateDoesNotExist 的异常。
    django.template.loader.select_template(template_name_list) : select_template 很像 get_template ,不过它是以模板名称的列表作为参数的,并且它返回第一个存在的模板。 如果模板都不存在,将会触发 TemplateDoesNotExist 异常。

    django.template.loaders.filesystem.load_template_source : 这个加载器根据 TEMPLATE_DIRS 的设置从文件系统加载模板。
    django.template.loaders.app_directories.load_template_source : 这个加 载器从文件系统上的Django应用中加载模板。 对 INSTALLED_APPS 中的每个应用,这个加 载器会查找一个 templates 子目录。 如果这个目录存在,Django就在那里寻找模板。
    这意味着你可以把模板和你的应用一起保存,从而使得Django应用更容易和默认模板一起发布。例如,如果 INSTALLED_APPS 包含 ('myproject.polls','myproject.music') ,那么 get_template('foo.html') 会按这个顺序查找模板:
    /path/to/myproject/polls/templates/foo.html
    /path/to/myproject/music/templates/foo.html

    扩展模板系统

    创建一个模板库
    创建一个模板库分两步走:
    第一,决定哪个Django应用应当拥有这个模板库。确保把你的应用添加到 INSTALLED_APPS 中。(如果想在主目录里面,又算那个应用的呢?)
    第二,在应用包里创建一个 templatetags 目录。
    在 templatetags 中创建两个空文件:__init__.py和一个用来存放你自定义的标签/过滤器定义的文件。
    第二个文件 的名字稍后将用来加载标签。如,如果你的自定义标签/过滤器在一个叫作 poll_extras.py 的文件中,你需要在模板中写入如下内容:
    {% load poll_extras %}

    {% load %} 标签检查 INSTALLED_APPS 中的设置,仅允许加载已安装的Django应用程序中的模板库。 这是一个安全特性。

    测试一下:在book目录里面增加一个templatetags目录,里面增加1个空文件:__init__.py
    创建book_extras.py,内容如下
    from django import template
    register = template.Library()
    def test(value, arg):
        "Removes all values of arg from the given string"
        return str(value) + ' ' + arg + 'and this is a test filter '
    register.filter('testx', test)

    @register.filter
    def toup(value):
        return str(value).upper()

    增加一个booktest.html文件,内容如下:
    {% load book_extras %}

      
      

    first test : {{ user|testx:"123" }}
      

    second upper: {{ user|toup }}

    更改books目录里面views.py内容为:
    #coding:gbk

    from django.template import RequestContext
    from django.shortcuts import render_to_response
    import os.path

    def booktest(request):
        bookurl = unicode(os.path.dirname(__file__), 'gbk') + ur'\templatetags\booktest.html'
        return render_to_response(bookurl,{'app': 'I am a test view'},
            context_instance=RequestContext(request ) )

    然后在mysite目录里面的urls.py增加一个对应的处理项:
        (r'^booktest/$', "mysite.books.views.booktest"),

    访问:http://127.0.0.1:8000/booktest/ 可以看到结果。

    定义tag标签:The time is {% current_time "%Y-%m-%d %I:%M %p" %}.

    标签块:{% comment %} {% endcomment %}

    包含标签:{% books_for_author author %}

    编写自定义模板加载器: load_template_source(template_name, template_dirs=None)

    还没有来得及研究~~

     
     
    2010-03-04 21:45

    django系统学习笔记~~(9)数据模型说明

    (8)http://hi.baidu.com/derris/blog/item/f490f213dc314f095baf53cc.html
    (10)http://hi.baidu.com/derris/blog/item/8cb9a635d06d061a91ef39f3.html

    在dos模式,进入到mysite的目录里面~~

    运行:

    >>> from mysite.books.models import Book
    >>> for i in Book.objects.all():
    ...     print i.id, i.title
    ............................在列出的一堆里面找一个。 id 是默认表的主键,自动生成的。
    >>> b = Book.objects.get(id=1)   # 1一般都有
    >>> b.title
    u'The Django Book'     # 具体当然不一样

    我们可以根据外键来直接引用其他的表数据:
    >>> for i in Book.objects.all():
    ...     print i.id, i.title, i.publisher.website
    把对应的出版社的网站都打印出来了。反向也可以,但是因为是一对多的关系:

    >>> from mysite.books.models import Publisher
    >>> for i in Publisher.objects.all():
    ...     print i
    ...
    Apress
    newpub
    >>> p = Publisher.objects.get(name='newpub')
    >>> p.book_set.all()               # 因为一对多的关系,所以要反向追溯,就要加_set找到book的数据集。
    [, ]

    >>> p.book_set.filter(title__icontains='s')
    [, ]

    对于多对多,也是同一对多是一样的,在book表名后面加_set来反向追溯。(因为authors表里面没有指定book的字段,所以只能通过book_set来反向找。)
    >>> b = Book.objects.get(id=1)
    >>> b.authors.get(id=1).book_set.get(id=1).authors.get(id=1).book_set.all()
    整整转了一个圈来引用着玩~~

    更改数据库的表结构的时候一定要注意,django不会自动做的,最好的办法就是删除掉数据库重新建~~
    如果都运行了,就要小心一点,把模型和数据一定要对应起来,尤其是不要引起数据的逻辑错误。比如外键找不到了。。。

    models.Manager的用法

    在books下面的models.py文件中增加一个测试表和测试的Manager方法。

    class TestManager(models.Manager):
        def count_me(self, keyword):
                return self.filter(myname__icontains=keyword).count()

    class TestTable(models.Model):
        myname = models.CharField(max_length=100)
        myage = models.IntegerField()
        objects = TestManager()
        def __unicode__(self):
                return self.myname

    运行:python manage.py syncdb
    Creating table books_testtable

    然后运行shell:python manage.py shell

    >>> from books.models import TestTable
    >>> p = TestTable()
    >>> p.myname='test'
    >>> p.myage=18
    >>> p.save()

    测试数据加上,可以测试一下方法了 :) 注意不能用p调用~,因为manager方法建在类里面。

    >>> TestTable.objects.count_me('test')
    1

    注意着一个objects本身就存在django.db.models.manager.Manager object类型的。不可以用别的名字,否则默认只能有一个manager对象。objects就不存在了,也无法调用all,get等默认包含的方法。不过也可以显式的声明,增加多个manager。

        objects = models.Manager() # The default manager.
        dahl_objects = DahlBookManager() # The Dahl-specific manager.

    objects.all()默认调用Manager.get_query_set(),可以进行覆盖产生诸如:Person.men.all(),Person.women.all(),Person.people.all()的效果。。。子类再细分小类~~ 用的着么?

    类里面可以增加方法,使得类用起来更面向对象一些~~ 也可以扩充一下数据库的sql语句,使得更加灵活,直接执行一些数据库依赖的sql语句~~

    >>> from django.db import connection
    >>> cursor = connection.cursor()
    >>> cursor.execute("""
    ...    SELECT DISTINCT first_name
    ...    FROM people_person
    ...    WHERE last_name = %s""", ['Lennon'])
    >>> row = cursor.fetchone()
    >>> print row
    ['John']
    注意在SQL语句cursor.execute()使用”%s”,而不要在SQL内试图立刻添加一个参数. 如果你使用了这个技术,数据库后的基础库将会自动添加引用同时尽可能的转意你的参数.

    不要把你的视图代码和django.db.connection语句混杂在一起,把它们放在自定义模型或者自定义manager方法中

     
     
     

    django系统学习笔记~~(10)通用视图

    (9)http://hi.baidu.com/derris/blog/item/c0fe9f31140fd5a35fdf0e32.html
    (11)http://hi.baidu.com/derris/blog/item/88988e4b468297fb83025c1c.html

    首先在mysite中加一个about.html的模板(utf8编码):

    ha,我是about

    再更改urls.py文件,增加内容:
    from django.views.generic.simple import direct_to_template
    ...............
    (r'^about/$', direct_to_template, {'template': 'about.html' }),

    运行python manage.py runserver,访问: http://127.0.0.1:8000/about/就可以了.

    下面对books模型里面数据进行处理显示:
    创建一个publisher_list_page.html的模板如下:
    {% extends "base.html" %}
    {% block content %}
       

    Publishers


      

              {% for publisher in object_list %}
                 
    • {{ publisher.name }}

    •         {% endfor %}
         

    {% endblock %}

    urls.py中最后增加以下内容:
    from django.views.generic import list_detail
    from mysite.books.models import Publisher
    publisher_info = {
        'queryset': Publisher.objects.all(),
        'template_name': 'publisher_list_page.html'
    }
    urlpatterns += patterns('',
        (r'^publishers/$', list_detail.object_list, publisher_info)
    )

    访问: http://127.0.0.1:8000/publishers/就可以了~!

    下步扩展:
    首先定义一个友好的变量,模板的object_list名字很没有意义~~
    在publisher_info变量里面增加一个参数:'template_object_name': 'publisher', 就可以把object_list替换为publisher_list了.django自动加一个 _list真是无聊,感觉这些潜规则有些多,就和模型里面加_set一样.不如增加一个方法引用的明白.

    如果需要增加额外的内容,比如为publisher增加图书的信息,可以使用: extra_context参数.

    在publisher_info变量里面增加一个参数: 'extra_context': {'book_list': Book.objects.all()}这样可以把book的数据传过去.但是如果要传递数据的话,只会在第一访问的时候初始化一次,数据将会缓存起来,所以这里也可以传递函数名,这样可以保证每次都重新访问数据.更改为'extra_context': {'book_list': Book.objects.all}就可以了.这样传递的是all函数.

    urls.py中增加对应处理项:
        (r'^books/(\w+)/$', "mysite.views.books_by_publisher"),

    views.py中增加代码:
    from django.shortcuts import get_object_or_404
    from django.views.generic import list_detail
    from mysite.books.models import Book, Publisher
    def books_by_publisher(request, name):
        publisher = get_object_or_404(Publisher, name__iexact=name)
        return list_detail.object_list(
            request,
            queryset = Book.objects.filter(publisher=publisher),
            template_name = 'books_by_publisher.html',
            template_object_name = 'book',
            extra_context = {'publisher': publisher}
    )

    再增加一个处理模板books_by_publisher.html:
    {% extends "base.html" %}
    {% block content %}
          

    book


                  {% for book in book_list %}
               
  • {{ book.title }}

  •         {% endfor %}
    {% endblock %}

    访问http://127.0.0.1:8000/books/xxxxx
    xxxx
    是数据库里面的某出版社.

     

    2、Detail Views

    视图函数 : django.views.generic.list_detail.

    此视图提供单个对象的详细视图.

    例子

    继续上一个 object_list 的例子,我们将通过修改 URLconf 来添加一个给定作者的详细视图:

    ------------------------------------------------------------------------------------------------------------

    from mysite.books.models import Author
    from django.conf.urls.defaults import *
    from django.views.generic import list_detail

    author_list_info = {
    'queryset' : Author.objects.all(),
    'allow_empty': True,
    }
    author_detail_info = {
    "queryset" : Author.objects.all(),
    "template_name" : "author_detail.html",
    }

    urlpatterns = patterns('',
    (r'authors/$', list_detail.object_list, author_list_info),
    (r'^authors/(?P\d+)/$', list_detail.object_detail, author_detail_info),

    )

     --------------  template中的变量引用:{{ object.字段名 }}

    附录: django.views.generic.list_detail.object_list

    Description:

    A page representing a list of objects.

    Required arguments:

    • queryset: A QuerySet that represents the objects.

    Optional arguments:

    • paginate_by: An integer specifying how many objects should be displayed per page. If this is given, the view will paginate objects with paginate_by objects per page. The view will expect either a page query string parameter (via GET) or a page variable specified in the URLconf. See below.
    • page: The current page number, as an integer, or the string 'last'. This is 1-based. See below.
    • template_name: The full name of a template to use in rendering the page. This lets you override the default template name (see below).
    • template_loader: The template loader to use when loading the template. By default, it's django.template.loader.
    • extra_context: A dictionary of values to add to the template context. By default, this is an empty dictionary. If a value in the dictionary is callable, the generic view will call it just before rendering the template.
    • allow_empty: A boolean specifying whether to display the page if no objects are available. If this is False and no objects are available, the view will raise a 404 instead of displaying an empty page. By default, this is True.
    • context_processors: A list of template-context processors to apply to the view's template.
    • template_object_name: Designates the name of the template variable to use in the template context. By default, this is 'object'. The view will append '_list' to the value of this parameter in determining the variable's name.
    • mimetype: The MIME type to use for the resulting document. Defaults to the value of the setting.

    Template name:

    If template_name isn't specified, this view will use the template /_list.html by default.

    Template context:

    In addition to extra_context, the template's context will be:

    • object_list: The list of objects. This variable's name depends on the template_object_name parameter, which is 'object' by default. If template_object_name is 'foo', this variable's name will be foo_list.
    • is_paginated: A boolean representing whether the results are paginated. Specifically, this is set to False if the number of available objects is less than or equal to paginate_by.

    If the results are paginated, the context will contain these extra variables:

    • paginator: An instance of django.core.paginator.Paginator.
    • page_obj: An instance of django.core.paginator.Page.
    Notes on pagination

    If paginate_by is specified, Django will paginate the results. You can specify the page number in the URL in one of two ways:

    • Use the page parameter in the URLconf. For example, this is what your URLconf might look like:

      (r'^objects/page(?P[0-9]+)/$','object_list',dict(info_dict))
    • Pass the page number via the page query-string parameter. For example, a URL would look like this:

      /objects/?page=3
    • To loop over all the available page numbers, use the page_range variable. You can iterate over the list provided by page_range to create a link to every page of results.

    These values and lists are 1-based, not 0-based, so the first page would be represented as page 1.

    For more on pagination, read the .

    As a special case, you are also permitted to use last as a value for page:

    /objects/?page=last

    This allows you to access the final page of results without first having to determine how many pages there are.

    Note that pagemust be either a valid page number or the value last; any other value for page will result in a 404 error.

    django.views.generic.list_detail.object_detail

    A page representing an individual object.

    Description:

    A page representing an individual object.

    Required arguments:

    • queryset: A QuerySet that contains the object.

    • Either object_id or (slugandslug_field) is required.

      If you provide object_id, it should be the value of the primary-key field for the object being displayed on this page.

      Otherwise, slug should be the slug of the given object, and slug_field should be the name of the slug field in the QuerySet's model. By default, slug_field is 'slug'.

    Optional arguments:

    • template_name: The full name of a template to use in rendering the page. This lets you override the default template name (see below).

    • template_name_field: The name of a field on the object whose value is the template name to use. This lets you store template names in the data. In other words, if your object has a field 'the_template' that contains a string 'foo.html', and you set template_name_field to 'the_template', then the generic view for this object will use the template 'foo.html'.

      It's a bit of a brain-bender, but it's useful in some cases.

    • template_loader: The template loader to use when loading the template. By default, it's django.template.loader.

    • extra_context: A dictionary of values to add to the template context. By default, this is an empty dictionary. If a value in the dictionary is callable, the generic view will call it just before rendering the template.

    • context_processors: A list of template-context processors to apply to the view's template.

    • template_object_name: Designates the name of the template variable to use in the template context. By default, this is 'object'.

    • mimetype: The MIME type to use for the resulting document. Defaults to the value of the setting.

    Template name:

    If template_name isn't specified, this view will use the template /_detail.html by default.

    Template context:

    In addition to extra_context, the template's context will be:

    • object: The object. This variable's name depends on the template_object_name parameter, which is 'object' by default. If template_object_name is 'foo', this variable's name will be foo.

     

    -----------研究了一下,可以写个通用的paginate,拷贝到模版里面可以凑副着用,可以编辑成include的html文件:)

    {% include 'pagenavi.html.inc' %}。没有进行数字验证,反正不碍事~~









    第一页 {% if has_previous %}
            上一页
     {% else %}
       上一页
        {% endif %}
     
     {% if has_next %}
            下一页
     {% else %}
      下一页  
        {% endif %}
    最后一页{{pages}} 当前第{{page}}页

     
     
     

    django系统学习笔记~~(11)用 fastcgi, lighttpd 在windows和ubuntu下面部署

    (10)http://hi.baidu.com/derris/blog/item/8cb9a635d06d061a91ef39f3.html
    (12)http://hi.baidu.com/derris/blog/item/881384869570923566096e2a.html


    下载lighthttpd for windows版本 (当前是1.4.26-1 (SSL)版本)

    http://en.wlmp-project.net/downloads.php?cat=lighty

    安装后,把djanog的程序目录拷贝到htdocs下面,

    conf目录下面的lighttpd-inc.conf中调整以下内容:

    server.modules              = (
                                    "mod_rewrite",
                                    "mod_access",                                                              
                                    "mod_fastcgi",
                                    "mod_accesslog",
                                    "mod_alias",

    #增加fastcgi的配置:

    url.rewrite-once = (
        "^(/media.*)$" => "$1",
        "^/favicon\.ico$" => "/media/favicon.ico",
        "^(/.*)$" => "/mysite.fcgi$1",
    )

    server.document-root        = "htdocs/程序的目录/"

    先运行程序目录下面的fcgiserver:manage.py runfcgi method=threaded host=127.0.0.1 port=3033

    再运行lighttpd:lighttpd.exe -f conf/lighttpd-inc.conf -m lib -D

    然后访问127.0.0.1就搞定了。。。

    如果url总是被附加上了/*.fcgi/,则需要修改mysite目录里面的settings.py文件,加上选项:
    FORCE_SCRIPT_NAME=''

    重新运行一边!~~ 终于搞定了,哇哈哈~~~ 方便一点,编一个批处理文件:

    start /b yedasp/manage.py runfcgi method=threaded host=127.0.0.1 port=3033
    START /B lighttpd.exe -f yedasp/conf/lighttpd-inc.conf -m lib -D

    --------------------------------------------------------------------

    fastcgi在ubuntu8下面,好久不用ubuntu都忘光光用户名和密码了。。

    直接安装:

    apt-get install lighttpd

    whereis lighttpd

    从/etc/lighttpd/lighttpd.conf拷贝一份到/usr/local/lighttpd/

    cd /usr/local/lighttpd
    $ gedit lighttpd.conf #
    配置文件很直观明了,一般只要把server.document-root、server.errorlog、accesslog.filename改成你的实际目录和文件名字就可以了。ps aux | grep lighttpd , kill xxx ,

    运行:lighttpd -D -f lighttpd.conf ,访问127.0.0.1。没有问题就ok了

    然后拷贝mysite到lighttpd下面。运行一下普通模式python manage.py runserver,基本没有问题~,有些目录分割号错误的地方~~linux下面是/,而windows下用\,

    然后开始配置fastcgi了。

    easy_install flup

    然后运行 python manage.py runfcgi

    能提示出来首页内容就说明没有问题拉~~

    然后运行守护进程: python manage.py runfcgi daemonize=false method=threaded host=127.0.0.1 port=8888    端口无所谓了,就是等lighttpds的调用,配置对应起来就可以。

    配置lighttpd文件:

       server.modules    = (
    "mod_rewrite",  
    "mod_alias",  
    "mod_access",  
    "mod_status",  
    "mod_fastcgi",  
    "mod_accesslog",  
    )

       server.document-root = "/usr/local/lighttpd/test/"  


    fastcgi.server = (  
    "/mysite.fcgi" => (  
    "main" => (  
    "host" => "127.0.0.1",  
    "port" => 8888,  
    "check-local" => "disable"
    )  
    ),  
    )   


    alias.url += (  

    "/media/" => "/usr/lib/python2.5/site-packages/django/contrib/admin/media/"
    )   


    url.rewrite-once = (  
    "^(/media.*)$" => "$1",  
    "^/favicon\.ico$" => "/media/favicon.ico",  
    "^(/.*)$" => "/mysite.fcgi$1",  
    )  

    就是在根目录下面的所有东东都转送到mysite.fcgi的地方~~

    重新运行lighttpd,访问127.0.0.1就可以了,如果url总是被附加上了/*.fcgi/,则需要修改mysite目录里面的settings.py文件,加上选项:
    FORCE_SCRIPT_NAME=''

    重新运行程序lighttpd restart -f -D lighttpd.conf,基本上不会有问题了。。。。 唉,我一马虎没看清楚去掉rewrite前面的注释。浪费了3个小时调试搜索检查。。。

    ------------------------------------------------------------- 记录乱七八糟的东东。

    $ sbin/lighttpd -f lighttpd.conf # 启动lighttpd服务
    $ ps aux |grep lighttpd
    www 15403 0.0 0.9 2860 1148 ? S 00:15 0:00 sbin/lighttpd -f
    这就完成了从安装到启动的整个过程,很简单吧。从最后一行的输出可以看出,lighttpd是单进程服务的,这和apache不一样(也许是它的稳定性不如apache的一个原因)。


    -------------- 也可以自己下载特定版本:

    下载:http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.26.tar.gz

    root@ubuntu:/usr/local/lighttpd-1.4.26# ./configure

    checking一堆以后:

    提示错误:configure: error: pcre-config not found, install the pcre-devel package or build with --without-pcre

    查了一下:

    出现configure: error: C compiler cannot create executables … 安装apt-get install libc6-dev.

    出现configure: error: configure: error: pcre-config not found … 安装apt-get install libpcre3-dev

    出现configure: error: zlib-headers and/or libs where not found … 安装apt-get install zlib1g-dev

    出现configure: error: bzip2-headers and/or libs where not found … 安装apt-get install libbz2-dev

    于是运行:apt-get install libc3-dev

    再检查一下,果然是configure: error: zlib-headers and/or libs where not found, install them or build with --without-zlib

    运行:apt-get install zlib1g-dev

    直接运行:apt-get install libbz2-dev

    终于没有错误了

    $ ./configure --prefix=/usr/local/lighttpd-1.4.26
    $ make
    $ make instal


    fastcgi.server = (
        "/mysite.fcgi" => (
            "main" => (
                # Use host / port instead of socket for TCP fastcgi
                "host" => "127.0.0.1",
                "port" => 3033,
                "check-local" => "disable",
            )
        ),
    )
    alias.url = (
        "/media/" => "E:/LightTPD/yedaSp/media/",
    )
     
     
     
     
     

    django系统学习笔记~~(12)用 mod_python, apache 在windows下部署

    (11)http://hi.baidu.com/derris/blog/item/88988e4b468297fb83025c1c.html
    (13)http://hi.baidu.com/derris/blog/item/80e8eb9558405d40d1135e8e.html

    首先安装apache2.2x~~

    安装推荐的选项是windows服务方式,如果只是学习,可以选终端运行方式~~注意运行的时候会产生2个httpd的进程。因为Apache for Windows是多线程的,它并不像Unix版本那样为每个请求使用一个单独的进程。 而是通常运行两个Apache进程:一个父进程,和一个处理请求的子进程。在子进程内部由多个单独的线程来处理每个请求。
    在安装目录中的conf文件夹中是配置文件:
    生成httpd.conf,(如果已经有这个文件,会生成一个httpd.conf.default文件。在htdocs中生成index.html。如果有,也会生成一个.default文件。)

    选择终端运行方式,根据提示的绑定地址和端口访问,It works就ok了。。。

    具体可以参照以下:http://lamp.linux.gov.cn/Apache/ApacheMenu/platform/windows.html

    然后安装mod_python3x

    下载mod_python:http://www.apache.org/dist/httpd/modpython/win/3.3.1/

    安装mod_python自动加入Python的Lib中了。 还要选apache的目录,自动加文件到modules目录中。

    然后配置mod_python,打开Apache安装目录下的conf/httpd.conf,做如下修改:
    1、在LoadModule部分下面加入:LoadModule python_module modules/mod_python.so
    2、修改DocumentRoot 值,指向工作目录,比如:DocumentRoot "D:\Program Files\Apache Software Foundation\Apache2.2\htdocs\mysite" 。 我也不想这么长的目录,但是这个好像有权限方面的管理,在外面的目录总是提示访问拒绝~~回头再研究apache的使用说明吧~~
    加入

        SetHandler python-program
        PythonHandler django.core.handlers.modpython
        SetEnv DJANGO_SETTINGS_MODULE mysite.settings
        PythonDebug On
        PythonPath "['D:\Program Files\Apache Software Foundation\Apache2.2\htdocs', 'D:\Python25\Lib\site-packages\django'] + sys.path"


        SetHandler None


        SetHandler None


    AddHandle说明如果GET此目录下所有的.py文件用mod_python处理;
    PythonHandler MyTest是缺省的文件,当取得“/”时执行的文件;
    PythonDebug On把调试开关打开,如果出现错误,在浏览器上能看见出错的调用栈信息。

    重新启动Apache服务,在浏览器中访问就可以了~~

    在admin模块格式很乱,把django\contrib\admin目录下面的media目录拷贝到mysite下面就可以了。

    (很怪我在单位总是提示找不到对应的程序,mod_python.so加载不到server,查了半天,有人说是因为安装python没有选择for all user的问题,可是我试验了还是不行。。。浪费了一天,崩溃了。。。)

    每次更改python代码,系统都需要重启才能体现出来,可以增加一个配置选项

    MaxRequestsPerChild 1。

    MaxRequestsPerChild就像Unix版本中的指令一样,这条指令控制一个进程退出前将为多少个请求提供服务。 然而,与Unix不同的是,一个进程将为所有请求而不是只为一个请求服务,因此如果设置这条指令,建议将它设为一个很大的值。默认设置 MaxRequestsPerChild 0 使得进程从不退出。1就是访问一次就退出,刷新啦~~

    在google里面的解决方法,但是还是不行,我怀疑是我安装的某些dll支持版本不对,直接晕了.(cannot load mod_python into server site:apache.org)

    Some of the more commonly asked questions asked on the mailing list relate to mod_python configuration issues that are not currently covered in the documentation.

    Apache can't load mod_python.so
    ---------------------------------------------

    This more common problem on Windows, but can occur on other platforms. A typical apache error message looks like this:

    Syntax error on line 173 of C:/Program Files/Apache
    Group/Apache2/conf/httpd.conf:
    Cannot load C:/Program Files/Apache
    Group/Apache2/modules/mod_python.so into server: The
    specified module could not be found.

    On Windows this may indicate a problem with missing D
    Nicolas offered the following as an explanation on Windows:

    """
    One of the possible cause of your problem is that Apache does find
    mod_python.so but not one of the DLL it relies on. Unfortunately the error
    reporting in this case is quite scarce and misguiding.

    The candidates missing DLLs are python24.dll and the Microsoft Runtime DLLS
    (normally msvcr71.dll and msvcp71.dll).

    Make sure that your Python directory and the runtime DLLs can be found on
    your PATH. The runtime DLLs are normaly copied in your Python directory, so
    putting the Python directory on your PATH variable should do the trick.

    Also, make sure that the user which is running Apache has its PATH variable
    properly set. The best way to do this is to define it at the system-wide
    level, but logging it under the user and defining the variable at the user
    level is also possible.
    """

    Apache can't load mod_python.so - undefined symbol
    -----------------------------------------------------------------------

    This may look similar to the first example, but indicates a deeper problem. Typical error message:

    httpd: Syntax error on line 231 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_python.so into server: /usr/local/apache2/modules/mod_python.so: undefined symbol: apr_sockaddr_port_get

    This error could indicate an actual bug in mod_python, or a mismatch between the Apache version used to compile mod_python versus the one being used to run it. I'm not sure there is an easy answer, but we should offer some initial troubleshooting suggestions.

    make_obcallback: could not import mod_python.apache
    --------------------------------------------------------------------------

    This one seems to occur on all platforms with similar frequency, and is usually related to having python multiple versions on the same system. Typical error message:

    [Sun Apr 09 14:03:46 2006] [error] make_obcallback: could not import
    mod_python.apache.\n
    [Sun Apr 09 14:03:46 2006] [error] python_handler: no interpreter
    callback found.
    [Sun Apr 09 14:03:46 2006] [error] [client 192.168.2.100]
    python_handler: Can't get/create interpreter., referer:
    http://localhost/mptest.py

    The solution is to adjust that PATH apache uses so it finds the correct python version. This will be platform spe

     
     
     

    django系统学习笔记~~(13)输出非HTML内容

    (12)http://hi.baidu.com/derris/blog/item/881384869570923566096e2a.html
    (14)http://hi.baidu.com/derris/blog/item/9a15e0fdb22d9e49d7887d71.html

    输出一个图像~~, 在urls.py中增加一个对应项:

        (r'^my_image/$', views.my_image),

    在views.py增加处理方法:

    def my_image(request):
        image_data = open(r"d:\td.jpg", "rb").read()
        return HttpResponse(image_data, mimetype="image/png")

    访问:http://127.0.0.1:8000/my_image/ 可以看到图像了。

    没什么意思了,就是简单记录一下怎样生成文件吧:

    生成csv文件下载:

    import csv
    from django.http import HttpResponse

    UNRULY_PASSENGERS = [146,184,235,200,226,251,299,273,281,304,203]

    def unruly_passengers_csv(request):
        response = HttpResponse(mimetype='text/csv')
        response['Content-Disposition'] = 'attachment; filename=unruly.csv'
        writer = csv.writer(response)
        writer.writerow(['Year', 'Unruly Airline Passengers'])
        for (year, num) in zip(range(1995, 2006), UNRULY_PASSENGERS):
            writer.writerow([year, num])
        return response

    安装 ReportLab

    >easy_install.py ReportLab

    >>> import reportlab
    from cStringIO import StringIO
    from reportlab.pdfgen import canvas
    from django.http import HttpResponse

    def hello_pdf(request):
        # Create the HttpResponse object with the appropriate PDF headers.
        response = HttpResponse(mimetype='application/pdf')
        response['Content-Disposition'] = 'attachment; filename=hello.pdf'

        temp = StringIO()

        # Create the PDF object, using the StringIO object as its "file."
        p = canvas.Canvas(temp)

        # Draw things on the PDF. Here's where the PDF generation happens.
        # See the ReportLab documentation for the full list of functionality.
        p.drawString(100, 100, "Hello world.")

        # Close the PDF object cleanly.
        p.showPage()
        p.save()

        # Get the value of the StringIO buffer and write it to the response.
        response.write(temp.getvalue())
        return response

    rss
    激活syndication feeds, 添加如下的 urls.py
    from django.conf.urls.defaults import *
    from mysite.feeds import LatestEntries, LatestEntriesByCategory

    feeds = {
        'latest': LatestEntries,
        'categories': LatestEntriesByCategory,
    }

    urlpatterns = patterns('',
        # ...
        (r'^feeds/(?P.*)/$', 'django.contrib.syndication.views.feed',
            {'feed_dict': feeds}),
        # ...
    )
    一个简单的FeedThis simple example describes a feed of the latest five blog entries for a given blog:
    from django.contrib.syndication.feeds import Feed
    from mysite.blog.models import Entry

    class LatestEntries(Feed):
        title = "My Blog"
        link = "/archive/"
        description = "The latest news about stuff."

        def items(self):
            return Entry.objects.order_by('-pub_date')[:5]
    要注意的重要的事情如下所示:
    子类 django.contrib.syndication.feeds.Feed .
    title , link , 和 description 对应一个标准 RSS 里的 , <link> , 和 <description> 标签.<br> items() 是一个方法,返回一个用以包含在包含在feed的 <item> 元素里的 list 虽然例子里用Djangos database API返回的 NewsItem 对象, items() 不一定必须返回 model的实例 Although this example returns Entry objects using Django’s database API, items() doesn’t have to return model instances.<br> 还有一个步骤,在一个RSS feed里,每个(item)有一个(title),(link)和(description),我们需要告诉框架 把数据放到这些元素中 In an RSS feed, each <item> has a <title> , <link> , and <description> . We need to tell the framework what data to put into those elements.<br> 如果要指定 <title> 和 <description> ,可以建立一个Django模板(见Chapter 4)名字叫 feeds/latest_title.html 和 feeds/latest_description.html ,后者是URLConf里为对应feed指定的 slug 。注意 .html 后缀是必须的。 Note that the .html extension is required.<br> RSS系统模板渲染每一个条目,需要给传递2个参数给模板上下文变量:<br> obj : 当前对象 ( 返回到 items() 任意对象之一 )。<br> site : 一个表示当前站点的 django.models.core.sites.Site 对象。 这对于 {{ site.domain }} 或者 {{ site.name }} 很有用。<br> 如果你在创建模板的时候,没有指明标题或者描述信息,框架会默认使用 "{{ obj }}" ,对象的字符串表示。 (For model objects, this will be the __unicode__() method.<br> 你也可以通过修改 Feed 类中的两个属性 title_template 和 description_template 来改变这两个模板的名字。<br> 你有两种方法来指定 <link> 的内容。 Django 首先执行 items() 中每一项的 get_absolute_url() 方法。 如果该方法不存在,就会尝试执行 Feed 类中的 item_link() 方法,并将自身作为 item 参数传递进去。<br> get_absolute_url() 和 item_link() 都应该以Python字符串形式返回URL。<br> 对于前面提到的 LatestEntries 例子,我们可以实现一个简单的feed模板。 latest_title.html 包括:<br> {{ obj.title }}<br> 并且 latest_description.html 包含:<br> {{ obj.description }}<br> 一个更复杂的Feed框架通过参数支持更加复杂的feeds。<br> For example, say your blog offers an RSS feed for every distinct tag you’ve used to categorize your entries. 如果为每一个单独的区域建立一个 Feed 类就显得很不明智。<br> 取而代之的方法是,使用聚合框架来产生一个通用的源,使其可以根据feeds URL返回相应的信息。<br> Your tag-specific feeds could use URLs like this:<br> <span style="color:#d81e52">http://example.com/feeds/tags/python/</span> : Returns recent entries tagged with python<br> <span style="color:#d81e52">http://example.com/feeds/tags/cats/</span> : Returns recent entries tagged with cats<br> 固定的那一部分是 "beats" (区域)。<br> 举个例子会澄清一切。 下面是每个地区特定的feeds:<br> from django.core.exceptions import ObjectDoesNotExist<br> from mysite.blog.models import Entry, Tag</p> <p>class TagFeed(Feed):<br>     def get_object(self, bits):<br>         # In case of "/feeds/tags/cats/dogs/mice/", or other such<br>         # clutter, check that bits has only one member.<br>         if len(bits) != 1:<br>             raise ObjectDoesNotExist<br>         return Tag.objects.get(tag=bits[0])</p> <p>    def title(self, obj):<br>         return "My Blog: Entries tagged with %s" % obj.tag</p> <p>    def link(self, obj):<br>         return obj.get_absolute_url()</p> <p>    def description(self, obj):<br>         return "Entries tagged with %s" % obj.tag</p> <p>    def items(self, obj):<br>         entries = Entry.objects.filter(tags__id__exact=obj.id)<br>         return entries.order_by('-pub_date')[:30]<br> 以下是RSS框架的基本算法,我们假设通过URL /rss/beats/0613/ 来访问这个类:<br> 框架获得了URL /rss/beats/0613/ 并且注意到URL中的slug部分后面含有更多的信息。 它将斜杠("/" )作为分隔符,把剩余的字符串分割开作为参数,调用 Feed 类的 get_object() 方法。<br> 在这个例子中,添加的信息是 ['0613'] 。对于 /rss/beats/0613/foo/bar/ 的一个URL请求, 这些信息就是 ['0613', 'foo', 'bar'] 。<br> get_object() 就根据给定的 bits 值来返回区域信息。<br> In this case, it uses the Django database API to retrieve the Tag . Note that get_object() should raise django.core.exceptions.ObjectDoesNotExist if given invalid parameters. 在 Beat.objects.get() 调用中也没有出现 try /except 代码块。 函数在出错时抛出 Beat.DoesNotExist 异常,而 Beat.DoesNotExist 是 ObjectDoesNotExist 异常的一个子类型。<br> 为产生 <title> , <link> , 和 <description> 的feeds, Django使用 title() , link() , 和 description() 方法。 在上面的例子中,它们都是简单的字符串类型的类属性,而这个例子表明,它们既可以是字符串, 也可以是 方法。 对于每一个 title , link 和 description 的组合,Django使用以下的算法:<br> 试图调用一个函数,并且以 get_object() 返回的对象作为参数传递给 obj 参数。<br> 如果没有成功,则不带参数调用一个方法。<br> 还不成功,则使用类属性。<br> 最后,值得注意的是,这个例子中的 items() 使用 obj 参数。对于 items 的算法就如同上面第一步所描述的那样,首先尝试 items(obj) , 然后是 items() ,最后是 items 类属性(必须是一个列表)。<br> Feed 类所有方法和属性的完整文档,请参考官方的Django文档 (<span style="color:#d81e52">http://www.djangoproject.com/documentation/0.96/syndication_feeds/</span>) 。<br> 指定Feed的类型默认情况下, 聚合框架生成RSS 2.0. 要改变这样的情况, 在 Feed 类中添加一个 feed_type 属性. To change that, add a feed_type attribute to your Feed class:<br> from django.utils.feedgenerator import Atom1Feed</p> <p>class MyFeed(Feed):<br>     feed_type = Atom1Feed<br> 注意你把 feed_type 赋值成一个类对象,而不是类实例。 目前合法的Feed类型如表11-1所示。<br> 表 11-1. Feed 类型 Feed 类 类型 <br> django.utils.feedgenerator.Rss201rev2Feed RSS 2.01 (default) <br> django.utils.feedgenerator.RssUserland091Feed RSS 0.91 <br> django.utils.feedgenerator.Atom1Feed Atom 1.0</p> <p>闭包为了指定闭包(例如,与feed项比方说MP3 feeds相关联的媒体资源信息),使用 item_enclosure_url , item_enclosure_length , 以及 item_enclosure_mime_type ,比如<br> from myproject.models import Song</p> <p>class MyFeedWithEnclosures(Feed):<br>     title = "Example feed with enclosures"<br>     link = "/feeds/example-with-enclosures/"</p> <p>    def items(self):<br>         return Song.objects.all()[:30]</p> <p>    def item_enclosure_url(self, item):<br>         return item.song_url</p> <p>    def item_enclosure_length(self, item):<br>         return item.song_length</p> <p>    item_enclosure_mime_type = "audio/mpeg"<br> 当然,你首先要创建一个包含有 song_url 和 song_length (比如按照字节计算的长度)域的 Song 对象。<br> 语言聚合框架自动创建的Feed包含适当的 <language> 标签(RSS 2.0) 或 xml:lang 属性(Atom). 他直接来自于您的 LANGUAGE_CODE 设置. This comes directly from your LANGUAGE_CODE setting.<br> URLslink 方法/属性可以以绝对URL的形式(例如, "/blog/" )或者指定协议和域名的URL的形式返回(例如 "<span style="color:#d81e52">http://www.example.com/blog/</span>" )。如果 link 没有返回域名,聚合框架会根据 SITE_ID 设置,自动的插入当前站点的域信息。 (See Chapter 16 for more on SITE_ID and the sites framework.)<br> Atom feeds需要 <link rel="self"> 指明feeds现在的位置。 The syndication framework populates this automatically.<br> 同时发布Atom and RSS一些开发人员想 同时 支持Atom和RSS。这在Django中很容易实现: 只需创建一个你的 feed 类的子类,然后修改 feed_type ,并且更新URLconf内容。 下面是一个完整的例子: Here’s a full example:<br> from django.contrib.syndication.feeds import Feed<br> from django.utils.feedgenerator import Atom1Feed<br> from mysite.blog.models import Entry</p> <p>class RssLatestEntries(Feed):<br>     title = "My Blog"<br>     link = "/archive/"<br>     description = "The latest news about stuff."</p> <p>    def items(self):<br>         return Entry.objects.order_by('-pub_date')[:5]</p> <p>    def item_link(self, item):<br>         return "/qiye/%s/" % item.qiyname<br>     def item_title(self, item):<br>         return item.qiyname<br>     def item_description(self, item):<br>         return item.diz </p> <p>class AtomLatestEntries(RssLatestEntries):<br>     feed_type = Atom1Feed<br> 这是与之相对应那个的URLconf:<br> from django.conf.urls.defaults import *<br> from myproject.feeds import RssLatestEntries, AtomLatestEntries</p> <p>feeds = {<br>     'rss': RssLatestEntries,<br>     'atom': AtomLatestEntries,<br> }</p> <p>urlpatterns = patterns('',<br>     # ...<br>     (r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed',<br>         {'feed_dict': feeds}),<br>     # ...<br> )<br> Sitemap 框架sitemap 是你服务器上的一个XML文件,它告诉搜索引擎你的页面的更新频率和某些页面相对于其它页面的重要性。 这个信息会帮助搜索引擎索引你的网站。<br> 例如,这是 Django 网站(<span style="color:#d81e52">http://www.djangoproject.com/sitemap.xml)sitemap</span>的一部分:<br> <?xml version="1.0" encoding="UTF-8"?><br> <urlset xmlns="<span style="color:#d81e52">http://www.sitemaps.org/schemas/sitemap/0.9</span>"><br> <url><br>     <loc>http://www.djangoproject.com/documentation/</loc><br>     <changefreq>weekly</changefreq><br>     <priority>0.5</priority><br> </url><br> <url><br>     <loc>http://www.djangoproject.com/documentation/0_90/</loc><br>     <changefreq>never</changefreq><br>     <priority>0.1</priority><br> </url><br> ...<br> </urlset><br> 需要了解更多有关 sitemaps 的信息, 请参见 <span style="color:#d81e52">http://www.sitemaps.org/</span>.<br> Django sitemap 框架允许你用 Python 代码来表述这些信息,从而自动创建这个XML文件。 To create a sitemap, you just need to write a Sitemap class and point to it in your URLconf.<br> 安装要安装 sitemap 应用程序, 按下面的步骤进行:<br> 将 'django.contrib.sitemaps' 添加到您的 INSTALLED_APPS 设置中.<br> 确保 'django.template.loaders.app_directories.load_template_source' 在您的 TEMPLATE_LOADERS 设置中。 默认情况下它在那里, 所以, 如果你已经改变了那个设置的话, 只需要改回来即可。<br> 确定您已经安装了 sites 框架 (参见第14章).<br> Note<br> sitemap 应用程序没有安装任何数据库表. 它需要加入到 INSTALLED_APPS 中的唯一原因是: 这样 load_template_source 模板加载器可以找到默认的模板. The only reason it needs to go into INSTALLED_APPS is so the load_template_source template loader can find the default templates.<br> Initialization要在您的Django站点中激活sitemap生成, 请在您的 URLconf 中添加这一行:<br> (r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps})<br> This line tells Django to build a sitemap when a client accesses /sitemap.xml . Note that the dot character in sitemap.xml is escaped with a backslash, because dots have a special meaning in regular expressions.<br> sitemap文件的名字无关紧要,但是它在服务器上的位置却很重要。 搜索引擎只索引你的sitemap中当前URL级别及其以下级别的链接。 用一个实例来说,如果 sitemap.xml 位于你的根目录,那么它将引用任何的URL。 然而,如果你的sitemap位于 /content/sitemap.xml ,那么它只引用以 /content/ 打头的URL。<br> sitemap视图需要一个额外的必须的参数: {'sitemaps': sitemaps} . sitemaps should be a dictionary that maps a short section label (e.g., blog or news ) to its Sitemap class (e.g., BlogSitemap or NewsSitemap ). It may also map to an instance of a Sitemap class (e.g., BlogSitemap(some_var) ).<br> Sitemap 类Sitemap 类展示了一个进入地图站点简单的Python类片断.例如,一个 Sitemap 类能展现所有日志入口,而另外一个能够调度所有的日历事件。 For example, one Sitemap class could represent all the entries of your weblog, while another could represent all of the events in your events calendar.<br> 在最简单的例子中,所有部分可以全部包含在一个 sitemap.xml 中,也可以使用框架来产生一个站点地图,为每一个独立的部分产生一个单独的站点文件。<br> Sitemap 类必须是 django.contrib.sitemaps.Sitemap 的子类. 他们可以存在于您的代码树的任何地方。<br> 例如假设你有一个blog系统,有一个 Entry 的model,并且你希望你的站点地图包含所有连到你的blog入口的超链接。 你的 Sitemap 类很可能是这样的:<br> from django.contrib.sitemaps import Sitemap<br> from mysite.blog.models import Entry</p> <p>class BlogSitemap(Sitemap):<br>     changefreq = "never"<br>     priority = 0.5</p> <p>    def items(self):<br>         return Entry.objects.filter(is_draft=False)</p> <p>    def lastmod(self, obj):<br>         return obj.pub_date<br> 声明一个 Sitemap 和声明一个 Feed 看起来很类似;这都是预先设计好的。<br> 如同 Feed 类一样, Sitemap 成员也既可以是方法,也可以是属性。 想要知道更详细的内容,请参见上文 《一个复杂的例子》章节。<br> 一个 Sitemap 类可以定义如下 方法/属性:<br> items (必需 ):提供对象列表。 框架并不关心对象的 类型 ;唯一关心的是这些对象会传递给 location() , lastmod() , changefreq() ,和 priority() 方法。<br> location (可选): 给定对象的绝对URL。 绝对URL不包含协议名称和域名。 下面是一些例子:<br> 好的: '/foo/bar/' '/foo/bar/'<br> 差的: 'example.com/foo/bar/' 'example.com/foo/bar/'<br> Bad: 'http://example.com/foo/bar/'<br> 如果没有提供 location , 框架将会在每个 items() 返回的对象上调用 get_absolute_url() 方法.<br> lastmod (可选): 对象的最后修改日期, 作为一个Python datetime 对象. The object’s last modification date, as a Python datetime object.<br> changefreq (可选): 对象变更的频率。 可选的值如下(详见Sitemaps文档):<br> 'always'<br> 'hourly'<br> 'daily'<br> 'weekly'<br> 'monthly'<br> 'yearly'<br> 'never'<br> priority (可选): 取值范围在 0.0 and 1.0 之间,用来表明优先级。<br> 快捷方式sitemap框架提供了一些常用的类。 在下一部分中会看到。<br> FlatPageSitemapdjango.contrib.sitemaps.FlatPageSitemap 类涉及到站点中所有的flat page,并在sitemap中建立一个入口。 但仅仅只包含 location 属性,不支持 lastmod , changefreq ,或者 priority 。<br> 参见第16章获取有关flat page的更多的内容.<br> GenericSitemapGenericSitemap 与所有的通用视图一同工作(详见第9章)。<br> 你可以如下使用它,创建一个实例,并通过 info_dict 传递给通用视图。 唯一的要求是字典包含 queryset 这一项。 也可以用 date_field 来指明从 queryset 中取回的对象的日期域。 这会被用作站点地图中的 lastmod 属性。<br> 下面是一个使用 FlatPageSitemap and GenericSiteMap (包括前面所假定的 Entry 对象)的URLconf:<br> from django.conf.urls.defaults import *<br> from django.contrib.sitemaps import FlatPageSitemap, GenericSitemap<br> from mysite.blog.models import Entry</p> <p>info_dict = {<br>     'queryset': Entry.objects.all(),<br>     'date_field': 'pub_date',<br> }</p> <p>sitemaps = {<br>     'flatpages': FlatPageSitemap,<br>     'blog': GenericSitemap(info_dict, priority=0.6),<br> }</p> <p>urlpatterns = patterns('',<br>     # some generic view using info_dict<br>     # ...</p> <p>    # the sitemap<br>     (r'^sitemap\.xml$',<br>      'django.contrib.sitemaps.views.sitemap',<br>      {'sitemaps': sitemaps})<br> )<br> 创建一个Sitemap索引sitemap框架同样可以根据 sitemaps 字典中定义的单独的sitemap文件来建立索引。 用法区别如下:<br> 您在您的URLconf 中使用了两个视图: django.contrib.sitemaps.views.index 和 django.contrib.sitemaps.views.sitemap . django.contrib.sitemaps.views.index and django.contrib.sitemaps.views.sitemap .<br> django.contrib.sitemaps.views.sitemap 视图需要带一个 section 关键字参数.<br> 这里是前面的例子的相关的 URLconf 行看起来的样子:<br> (r'^sitemap.xml$',<br> 'django.contrib.sitemaps.views.index',<br> {'sitemaps': sitemaps}),</p> <p>(r'^sitemap-(?P<section>.+).xml$',<br> 'django.contrib.sitemaps.views.sitemap',<br> {'sitemaps': sitemaps})<br> 这将自动生成一个 sitemap.xml 文件, 它同时引用 sitemap-flatpages.xml 和 sitemap-blog.xml . Sitemap 类和 sitemaps 目录根本没有更改.</p> </div> </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix"> <h2 class="title content-title">django系统学习笔记~~(14)session</h2> <div id="content" class="content text-content clearfix"> <p></p> <p>(13) <span style="color:#d81e52">http://hi.baidu.com/derris/blog/item/80e8eb9558405d40d1135e8e.html</span><br> (15) <span style="color:#d81e52">http://hi.baidu.com/derris/blog/item/3b0bd4031e3e8de009fa93fd.html</span></p> <p><span style="color:#d81e52"></span></p> <p>确定settings.py中,SessionMiddleware 和 INSTALLED_APPS 设置中的'django.contrib.sessions' 没有被注释掉。</p> <p>简单的测试一下seesion的功能,直接用request.session["sessionName"]引用就可以了,也可以删除del ..</p> <p>做个实例~~<br> 增加一个登录模板:<strong>login_form.html<br> <html> <body> <form action="" method="post"><br>         <table> <input type="text" name="user"><br>         <input type="password" name="passwd"><br>         </table><input type="submit" value="Submit"><br> </form></body></html></strong></p> <p>在<strong>urls.py</strong>中增加一个对应选项<br> <strong>    (r'^login/$', views.login), </strong></p> <p>在<strong>views.py</strong>中增加对应的处理函数<br> <strong>from django.contrib import auth<br> def login(request):<br>     # 如果提交form<br>     if request.method == 'POST':<br>         # 测试cookie是否工作:<br>         if request.session.test_cookie_worked():<br>             #如果cookie工作,就删除.<br>             request.session.delete_test_cookie()<br>             # 我们这里需要验证用户 <br>             user = auth.authenticate(username=request.POST['user'], password=request.POST['passwd'])<br>             if user is not None and user.is_active:<br>                 auth.login(request, user)<br>                 return HttpResponse("login correct: " + request.POST['user'] + " : my cookie:" + request.session["mytest"])<br>             else:<br>                 auth.logout(request) # 登录不正确,自动退出<br>                 return HttpResponse("login incorrect: " + request.POST['user']) <br>         else:<br>             return HttpResponse("需要cookie支持。")</strong></p> <p><strong>    #如果不是post方法,就显示网页.<br>     request.session.set_test_cookie()<br>     request.session["mytest"] = "my test is just like that."<br>     return render_to_response('login_form.html')</strong></p> <p>运行服务器,访问<strong><span style="color:#d81e52">http://127.0.0.1:8000/login</span></strong>,就可以看到结果。<br> --<br> 列出你的服务器所有cookie内容.dos下进入到mysite目录,运行manage.py shell<br> >>> for i in Session.objects.all():<br> ...     print i.get_decoded(), i.pk<br> 可以根据pk值进行查询,也可以访问<span style="color:#d81e52">http://127.0.0.1:8000/look</span>可以看到你的sessionid,然后可以单独查询.<br> >>> s = Session.objects.get(pk="2271b2b1477c49c13ac9774a974229b0")<br> >>> s.expire_date<br> datetime.datetime(2010, 4, 2, 0, 0, 0, 0)<br> >>> s.session_data<br> u'gAJ9cQFVBm15dGVzdHECVRpteSB0ZXN0IGlzIGp1c3QgbGlrZSB0aGF0LnEDcy44OWFmNmRlZDU0\n<br> NTczZTk0ZGUyNTkzMjYyODEyNTQ3NA==\n'<br> >>> s.get_decoded()<br> {'mytest': 'my test is just like that.'}</p> <p>session过期默认是2个周,SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 False , SESSION_COOKIE_AGE 保存多少秒</p> <p>SESSION_COOKIE_DOMAIN 使用会话cookie(session cookies)的站点。将它设成一个字符串,就好象`` “.example.com”`` 以用于跨站点(cross-domain)的cookie,或`` None`` 以用于单个站点。</p> <p>SESSION_COOKIE_NAME 会话中使用的cookie的名字。 它可以是任意的字符串。 "sessionid"<br> <br> SESSION_COOKIE_SECURE 是否在session中使用安全cookie, 如果设置 True , cookie就会标记为安全, 这意味着cookie只会通过HTTPS来传输</p> <p><br> django提供认证授权的支持,前面已经在settings.py中打开了. 访问<span style="color:#d81e52">http://127.0.0.1:8000/admin/</span>就可以登录了.</p> <p>判断授权的用户可以用request.user.is_authenticated().<br> user的属性<br> username 必需的,不能多于30个字符。 仅用字母数字式字符(字母、数字和下划线)。 <br> first_name 可选; 少于等于30字符. <br> last_name 可选; 少于等于30字符. <br> email 可选. 邮件地址. <br> password 密码的哈希值,django不保存明码. <br> is_staff 布尔值. 用户是否拥有网站的管理权限. <br> is_active 布尔值. 用户是否拥有所有权限,而无需任何显式的权限分配定义用户最后登录的时间,缺省会设置为当前时间 <br> is_superuser Boolean. Designates that this user has all permissions without explicitly assigning them. <br> last_login 用户上次登录的时间日期。 它被默认设置为当前的日期/时间。 <br> date_joined 账号被创建的日期时间 当账号被创建时,它被默认设置为当前的日期/时间。</p> <p>通过用户也可以得到用户groups和授权permissions表的引用.<br> myuser.groups = group_list<br> # 增加用户到某组:<br> myuser.groups.add(group1, group2,...)<br> # 删除某组<br> myuser.groups.remove(group1, group2,...)<br> # 删除所有<br> myuser.groups.clear()</p> <p># 授权<br> myuser.permissions = permission_list<br> myuser.permissions.add(permission1, permission2, ...)<br> myuser.permissions.remove(permission1, permission2, ...)<br> myuser.permissions.clear()</p> <p>django手工认证.(自己增加一个用户,检查就好.)<br> >>> from django.contrib import auth<br> >>> user = auth.authenticate(username='derris', password='xman123')<br> >>> if user is not None and user.is_active:<br> ...     print "Correct!"<br> ... else:<br> ...     print "Invalid password."</p> <p>在视图里面,就可以用auth.login(request, user),完成登录了.</p> <p><br> django提供自动的登录视图,只需要指定对应的模板就可以处理。(还是自己处理简单。。。)</p> <p>from django.contrib.auth.views import login, logout</p> <p>urlpatterns = patterns('',<br>     # existing patterns here...<br>     (r'^accounts/login/$', login),<br>     (r'^accounts/logout/$', logout),<br> )</p> <p>================================ 模板要包括这些东东:next的内容是自动在登录以后重新定向的url(缺省会重定向到 /accounts/profile )。。。<br> {% if form.errors %}<br>     <p class="error">Sorry, that's not a valid username or password</p><br> {% endif %}</p> <p><form action="" method="post"><br>     <label for="username">User name:</label><br>     <input type="text" name="username" value="" id="username"><br>     <label for="password">Password:</label><br>     <input type="password" name="password" value="" id="password"></p> <p>    <input type="submit" value="login" /><br>     <input type="hidden" name="next" value="{{ next|escape }}" /><br> </form><br> ==============================</p> <p><br> 对于需要登录的视图函数,可以加个修饰符。<br> from django.contrib.auth.decorators import login_required</p> <p><strong>@login_required        <br> </strong>def my_view(request):<br>     # ...<br> <strong>#如果用户没有登录,就无法访问改页啦,如果想自动到登录页面,就要使用django系统的login模板~~。</strong></p> <p>检查用户是否有访问资源的权限用:request.user.has_perm('xxxx'))就可以了。权限在admin管理里面可以设置。<br> 也有对应的修饰符:<br> def user_can_vote(user):<br>     return user.is_authenticated() and user.has_perm("polls.can_vote")</p> <p><strong>@user_passes_test(user_can_vote, login_url="/login/")</strong><br> def vote(request):<br>     # Code here can assume a logged-in user with the correct permission.</p> <p>还有更简单的:<br> from django.contrib.auth.decorators import permission_required</p> <p><strong>@permission_required('polls.can_vote', login_url="/login/")<br> </strong>def vote(request):<br>     # ...</p> <p>后面不打算自己开发用~~简单记录一下:</p> <p>创建用户使用 create_user 辅助函数创建用户:<br> >>> from django.contrib.auth.models import User<br> >>> user = User.objects.create_user(username='john',<br> ...                                 <span style="color:#d81e52">email='jlennon@beatles.com'</span>,<br> ...                                 password='glass onion')<br> 在这里, user 是 User 类的一个实例,准备用于向数据库中存储数据。 create_user() 函数并没有在数据库中创建记录,在保存数据之前,你仍然可以继续修改它的属性值。<br> >>> user.is_staff = True<br> >>> user.save()<br> 修改密码你可以使用 set_password() 来修改密码:<br> >>> user = User.objects.get(username='john')<br> >>> user.set_password('goo goo goo joob')<br> >>> user.save()<br> 除非你清楚的知道自己在做什么,否则不要直接修改 password 属性。 其中保存的是密码的 加入salt的hash值 ,所以不能直接编辑。<br> 一般来说, User 对象的 password 属性是一个字符串,格式如下:<br> hashtype$salt$hash<br> 这是哈希类型,salt和哈希本身,用美元符号($)分隔。<br> hashtype 是 sha1 (默认)或者 md5 ,它是用来处理单向密码哈希的算法,Salt是一个用来加密原始密码来创建哈希的随机字符串,例如: salt is a random string used to salt the raw password to create the hash, for example:<br> sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4<br> User.set_password() 和 User.check_password() 函数在后台处理和检查这些值。<br> 加了salt是为了防止对单向哈希值进行字典对应查找破解,就算知道salt的算法,也要一个一个的计算,增加破解难度。</p> <p>创建自己的用户注册功能:</p> <p>from django import forms<br> from django.contrib.auth.forms import UserCreationForm<br> from django.http import HttpResponseRedirect<br> from django.shortcuts import render_to_response</p> <p>def register(request):<br>     if request.method == 'POST':<br>         form = UserCreationForm(request.POST)<br>         if form.is_valid():<br>             new_user = form.save()<br>             return HttpResponseRedirect("/books/")<br>     else:<br>         form = UserCreationForm()<br>     return render_to_response("registration/register.html", {<br>         'form': form,<br>     })<br> 这个表单构想了一个叫 registration/register.html 的模板. 这里是一个这个模板的可能的样子的例子:<br> {% extends "base.html" %}</p> <p>{% block title %}Create an account{% endblock %}</p> <p>{% block content %}<br> <h1>Create an account</h1></p> <p><form action="" method="post"><br>       {{ form.as_p }}<br>       <input type="submit" value="Create the account"><br> </form><br> {% endblock %}<br> 从技术上来说,只有当你使用了 RequestContext 并且 TEMPLATE_CONTEXT_PROCESSORS 设置包含了 "django.core.context_processors.auth" (默认情况就是如此)时,这些变量才能在模板context中使用。<br> 当使用 RequestContext 时, 当前用户 (是一个 User 实例或一个 AnonymousUser 实例) 存储在模板变量 {{ user }} 中:<br> {% if user.is_authenticated %}<br> <p>Welcome, {{ user.username }}. Thanks for logging in.</p><br> {% else %}<br> <p>Welcome, new user. Please log in.</p><br> {% endif %}<br> 这些用户的权限信息存储在 {{ perms }} 模板变量中。<br> 你有两种方式来使用 perms 对象。 你可以使用类似于 {{ perms.polls }} 的形式来检查,对于某个特定的应用,一个用户是否具有 任意 权限;你也可以使用 {{ perms.polls.can_vote }} 这样的形式,来检查一个用户是否拥有特定的权限。<br> 这样你就可以在模板中的 {% if %} 语句中检查权限:<br> {% if perms.polls %}<br> <p>You have permission to do something in the polls app.</p><br> {% if perms.polls.can_vote %}<br>     <p>You can vote!</p><br> {% endif %}<br> {% else %}<br> <p>You don't have permission to do anything in the polls app.</p><br> {% endif %}<br> 消息系统会为给定的用户接收消息。 每个消息都和一个 User 相关联。<br> 在每个成功的操作以后,Django的admin管理接口就会使用消息机制。 例如,当你创建了一个对象,你会在admin页面的顶上看到 The object was created successfully 的消息。<br> 你也可以使用相同的API在你自己的应用中排队接收和显示消息。 API非常地简单:<br> 要创建一条新的消息,使用 user.message_set.create(message='message_text') 。<br> 要获得/删除消息,使用 user.get_and_delete_messages() ,这会返回一个 Message 对象的列表,并且从队列中删除返回的项。<br> 在例子视图中,系统在创建了播放单(playlist)以后,为用户保存了一条消息。<br> def create_playlist(request, songs):<br>     # Create the playlist with the given songs.<br>     # ...<br>     request.user.message_set.create(<br>         message="Your playlist was added successfully."<br>     )<br>     return render_to_response("playlists/create.html",<br>         context_instance=RequestContext(request))<br> 当使用 RequestContext ,当前登录的用户以及他(她)的消息,就会以模板变量 {{ messages }} 出现在模板的context中。<br> {% if messages %}<br> <ul><br>     {% for message in messages %}<br>     <li>{{ message }}</li><br>     {% endfor %}<br> </ul><br> {% endif %}</p> </div> </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix"> <h2 class="title content-title">django系统学习笔记~~(15)缓存</h2> <div id="content" class="content text-content clearfix"> <p>(14) <span style="color:#d81e52">http://hi.baidu.com/derris/blog/item/9a15e0fdb22d9e49d7887d71.html</span></p> <p>缓存工作原理:<br> 接到一个链接请求URL,尝试在缓存中搜索。<br> 如果存在:<br>     返回缓存内容。<br> 否则:<br>     生成指定页面<br>     保存到缓存中<br>     返回页面</p> <p>------------</p> <p>访问前面的例子:<span style="color:#d81e52">http://127.0.0.1:8000/time/</span><br> 每次访问都会返回当前时间,就是说每次访问都是变化的。</p> <p>在<strong>settings.py</strong>文件中增加一个文件系统的全站缓存。</p> <p><strong>CACHE_BACKEND = 'file://d:/foo'</strong></p> <p>更改middlewar_classes的选项(注意顺序很重要,先update再fetch)。<br> <strong>MIDDLEWARE_CLASSES = (<br>     'django.middleware.cache.UpdateCacheMiddleware',<br>     'django.middleware.common.CommonMiddleware',<br>     'django.contrib.sessions.middleware.SessionMiddleware',<br>     'django.middleware.locale.LocaleMiddleware',<br>     'django.contrib.auth.middleware.AuthenticationMiddleware',<br>     'django.middleware.cache.FetchFromCacheMiddleware',<br> )</strong></p> <p>然后再访问:<span style="color:#d81e52">http://127.0.0.1:8000/time/</span> ,被缓存了,就不会再变化了。。。<br> 当然这个缓存的很无聊。。。这里故意用他测试的,注释掉吧。<br> <strong>#'django.middleware.cache.UpdateCacheMiddleware',<br> #'django.middleware.cache.FetchFromCacheMiddleware',</strong><br> 访问:<span style="color:#d81e52">http://127.0.0.1:8000/time/</span>, 又开始变化了。</p> <p>如果全局缓存的时候注意get和post的页面是不区分的,所以不可以使用~~<br> 对于不想缓存的页面,用@never_cache修饰视图方法就可以。</p> <p>测试一下单个视图的缓存。<br> 在<strong>urls.py</strong>中,<br> 增加:<br> <strong>from django.views.decorators.cache import cache_page</strong></p> <p>更改time对应项<br> ('^time/$', cache_page(current_datetime)),<br> 再访问:<span style="color:#d81e52">http://127.0.0.1:8000/time/</span>, 又不变化,被缓存了~~</p> <p>也可以在视图中用参数,不过感觉在urls中大体感好些~~<br> @cache_page(60 * 15)<br> def current_datetime(request):</p> <p>cache_page后面可以加时间参数,定时刷新一下。<br> cache_page(my_view, 10)) 缓存10秒。(要把原来的缓存清掉。)<br> 如果是0,就不进行缓存,不知道处理方法是不是和@never_cache一样?</p> <p>对于上游isp提供商或者浏览器客户端缓存数据进行控制,可以使用vary头。</p> <p>比如在视图上用修饰符:<br> @vary_on_headers('User-Agent', 'Cookie')<br> def my_view(request):<br>     # ...<br> 该段代码通知上游缓存对两者都进行不同操作,也就是说 user-agent 和 cookie 的每种组合都应获取自己的缓存值。 举例来说,使用 Mozilla 作为 user-agent 而 foo=bar 作为 cookie 值的请求应该和使用 Mozilla 作为 user-agent 而 foo=ham 的请求应该被视为不同请求<br> 因为对于cookie缓存太常用,所以对于@vary_on_headers('Cookie')有个简单写法:@vary_on_cookie。</p> <p><br> 对于敏感数据的缓存~~<br> from django.views.decorators.cache import cache_control</p> <p>@cache_control(private=True)<br> def my_view(request):<br>     # ...</p> <p>对于大量数据传送,可以在中间件中进行压缩,用的很少把。。。<br> django.middleware.gzip.GZipMiddleware</p> <p><br> ---------------------------------</p> <p>在模板里面可以用标签使用缓存数据:<br> {% load cache %}<br> {% cache 500 sidebar request.user.username %}<br>     .. sidebar for logged in user ..<br> {% endcache %}</p> <p>cache 时间 名字 对应用户</p> <p>底层api<br> >>> from django.core.cache import cache<br> >>> cache.set('my_key', 'hello, world!', 30)<br> >>> cache.get('my_key')<br> 'hello, world!'</p> <p>------------------------------------<br> 缓存选择在你的settings文件的 CACHE_BACKEND 设置中,如果你使用缓存但没有指定 CACHE_BACKEND ,Django将默认使用 simple:///</p> <p>内存缓存Memcached<br> CACHE_BACKEND = 'memcached://127.0.0.1:11211/'<br> Memcached的一个极好的特性是它在多个服务器分享缓存的能力,这意味着你可以在多台机器上运行Memcached进程,程序将会把这组机器当作一个*单独的*缓存,而不需要在每台机器上复制缓存值<br> CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11212;172.19.26.244:11213/'</p> <p><br> 数据库缓存<br> python manage.py createcachetable [cache_table_name]<br> CACHE_BACKEND = 'db://my_cache_table'</p> <p><br> 文件系统缓存<br> CACHE_BACKEND = 'file:///var/tmp/django_cache'<br> </p> <p><br> 本地内存缓存<br> CACHE_BACKEND = 'locmem:///'<br> 目前没有跨进程共享,所以不是很好的选择,但是很有发展前途。</p> <p>仿缓存<br> 开发测试的时候用~~<br> CACHE_BACKEND = 'dummy:///'</p> <p>CACHE_BACKEND参数每个缓存后端都可能使用参数,它们在CACHE_BACKEND设置中以查询字符串形式给出,合法的参数为: 他们给予查询字符串的CACHE_BACKEND设置样式。 有效参数如下:<br> timeout:用于缓存的过期时间,以秒为单位。 这个参数默认被设置为300秒(五分钟)<br> filesystemmax_entries:对于locmem,database和后端,在高速缓存允许的最大条目数之前的旧值将被删除。 这个参数默认是300.<br> cull_frequency :当达到 max_entries 的时候,被接受的访问的比率。 实际的比率是 1/cull_frequency ,所以设置cull_frequency=2就是在达到 max_entries 的时候去除一半数量的缓存<br> 把 cull_frequency 的值设置为 0 意味着当达到 max_entries 时,缓存将被清空。 这将以很多缓存丢失为代价,大大提高接受访问的速度。<br> 在这个例子中, timeout 被设成 60<br> CACHE_BACKEND = "memcached://127.0.0.1:11211/?timeout=60"<br> 而在这个例子中, timeout 设为 30 而 max_entries 为 400 :<br> CACHE_BACKEND = "locmem:///?timeout=30&max_entries=400"<br> 其中,非法的参数与非法的参数值都将被忽略。<br> 站点级 Cache一旦高速缓存设置,最简单的方法是使用缓存缓存整个网站。您需要添加’django.middleware.cache.UpdateCacheMiddleware’和 ‘django.middleware.cache.FetchFromCacheMiddleware’您的MIDDLEWARE_CLASSES设置,在这个例子为:<br> MIDDLEWARE_CLASSES = (<br>     'django.middleware.cache.UpdateCacheMiddleware',<br>     'django.middleware.common.CommonMiddleware',<br>     'django.middleware.cache.FetchFromCacheMiddleware',<br> )<br> 注意:<br> 不,这不是一个错字: 中间件的更新,必须先在列表中,而获取的中间件,必须最后。 的细节有点模糊,但看到下面的MIDDLEWARE_CLASSES订阅如果您想看到完整的故事。<br> 然后,在你的Django settings文件里加入下面所需的设置:<br> CACHE_MIDDLEWARE_SECONDS :每个页面应该被缓存的秒数<br> CACHE_MIDDLEWARE_KEY_PREFIX :如果缓存被多个使用相同Django安装的网站所共享,那么把这个值设成当前网站名,或其他能代表这个Django实例的唯一字符串,以避免key发生冲突。 如果你不在意的话可以设成空字符串。<br> 缓存中间件缓存每个没有GET或者POST参数的页面,即如果用户请求页面并在查询字符串里传递GET参数或者POST参数,中间件将不会尝试得到缓存版本的页面,如果你打算使用整站缓存,设计你的程序时牢记这点,例如,不要使用拥有查询字符串的URLs,除非那些页面可以不缓存或者,如果CACHE_MIDDLEWARE_ANONYMOUS_ONLY设置为True,只有匿名请求(即不是由登录的用户)将被缓存作出的声明。 如果想取消用户相关页面(user-specific pages)的缓存,例如Djangos 的管理界面,这是一种既简单又有效的方法。 CACHE_MIDDLEWARE_ANONYMOUS_ONLY,你应该确保你已经启动AuthenticationMiddleware。<br> 此外,缓存中间件自动设置在每个中HttpResponse几个标题:<br> 当一个新(没缓存的)版本的页面被请求时设置Last-Modified头部为当前日期/时间<br> 设置Expires头部为当前日期/时间加上定义的CACHE_MIDDLEWARE_SECONDS<br> 设置Cache-Control头部来给页面一个最大的时间—再一次,根据CACHE_MIDDLEWARE_SECONDS设置</p> <p>视图级缓存更加颗粒级的缓存框架使用方法是对单个视图的输出进行缓存。 django.views.decorators.cache defines a cache_page decorator that will automatically cache the view’s response for you. 他是很容易使用的:<br> from django.views.decorators.cache import cache_page</p> <p>def my_view(request):<br>     # ...</p> <p>my_view = cache_page(my_view, 60 * 15)<br> Or, using Python 2.4’s decorator syntax:<br> @cache_page(60 * 15)<br> def my_view(request):<br>     # ...<br> cache_page 只接受一个参数: 以秒计的缓存超时。 在前例中, “my_view()” 视图的结果将被缓存 15 分钟。 (注意: 为了提高可读性,该参数被书写为 60 * 15 。 60 * 15 将被计算为 900 ,也就是说15 分钟乘以每分钟 60 秒。)<br> 和站点缓存一样,视图缓存与 URL 无关。 如果多个 URL 指向同一视图,每个视图将会分别缓存。 继续 my_view 范例,如果 URLconf 如下所示:<br> urlpatterns = ('',<br>     (r'^foo/(\d{1,2})/$', my_view),<br> )<br> 那么正如你所期待的那样,发送到 /foo/1/ 和 /foo/23/ 的请求将会分别缓存。 但一旦发出了特定的请求(如:</p> <p>在 URLconf 中指定视图缓存前一节中的范例将视图硬编码为使用缓存,因为 cache_page 在适当的位置对 my_view 函数进行了转换。 该方法将视图与缓存系统进行了耦合,从几个方面来说并不理想。 例如,你可能想在某个无缓存的站点中重用该视图函数,或者你可能想将该视图发布给那些不想通过缓存使用它们的人。 解决这些问题的方法是在 URLconf 中指定视图缓存,而不是紧挨着这些视图函数本身来指定。<br> 完成这项工作非常简单: 在 URLconf 中用到这些视图函数的时候简单地包裹一个 cache_page 。以下是刚才用到过的 URLconf : Here’s the old URLconf from earlier:<br> urlpatterns = ('',<br>     (r'^foo/(\d{1,2})/$', my_view),<br> )<br> 以下是同一个 URLconf ,不过用 cache_page 包裹了 my_view :<br> from django.views.decorators.cache import cache_page</p> <p>urlpatterns = ('',<br>     (r'^foo/(\d{1,2})/$', cache_page(my_view, 60 * 15)),<br> )<br> 如果采取这种方法, 不要忘记在 URLconf 中导入 cache_page .</p> </div> </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> <div class="content text-content clearfix">   </div> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1305063972113780736"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Django)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835408447806468096.htm" title="Ubuntu18.04 Docker部署Kinship(Django)项目过程" target="_blank">Ubuntu18.04 Docker部署Kinship(Django)项目过程</a> <span class="text-muted">Dante617</span> <div>1Docker的安装https://blog.csdn.net/weixin_41735055/article/details/1003551792下载镜像dockerpullprogramize/python3.6.8-dlib下载的镜像里包含python3.6.8和dlib19.17.03启动镜像dockerrun-it--namekinship-p7777:80-p3307:3306-p55</div> </li> <li><a href="/article/1835259969000271872.htm" title="软件测试/测试开发/全日制 |利用Django REST framework构建微服务" target="_blank">软件测试/测试开发/全日制 |利用Django REST framework构建微服务</a> <span class="text-muted">霍格沃兹-慕漓</span> <a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/sqlite/1.htm">sqlite</a> <div>霍格沃兹测试开发学社推出了《Python全栈开发与自动化测试班》。本课程面向开发人员、测试人员与运维人员,课程内容涵盖Python编程语言、人工智能应用、数据分析、自动化办公、平台开发、UI自动化测试、接口测试、性能测试等方向。为大家提供更全面、更深入、更系统化的学习体验,课程还增加了名企私教服务内容,不仅有名企经理为你1v1辅导,还有行业专家进行技术指导,针对性地解决学习、工作中遇到的难题。让找</div> </li> <li><a href="/article/1835210184419536896.htm" title="锋哥写一套前后端分离Python权限系统 基于Django5+DRF+Vue3.2+Element Plus+Jwt 视频教程 ,帅呆了~~" target="_blank">锋哥写一套前后端分离Python权限系统 基于Django5+DRF+Vue3.2+Element Plus+Jwt 视频教程 ,帅呆了~~</a> <span class="text-muted">java1234_小锋</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E6%9D%83%E9%99%90%E7%B3%BB%E7%BB%9F/1.htm">权限系统</a><a class="tag" taget="_blank" href="/search/django%E6%9D%83%E9%99%90%E7%B3%BB%E7%BB%9F/1.htm">django权限系统</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/web%E6%9D%83%E9%99%90%E7%B3%BB%E7%BB%9F/1.htm">web权限系统</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/DRF/1.htm">DRF</a><a class="tag" taget="_blank" href="/search/VUE%E6%9D%83%E9%99%90/1.htm">VUE权限</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>大家好,我是java1234_小锋老师,最近写了一套【前后端分离Python权限系统基于Django5+DRF+Vue3.2+ElementPlus+Jwt】视频教程,持续更新中,计划月底更新完,感谢支持。视频在线地址:打造前后端分离Python权限系统基于Django5+DRF+Vue3.2+ElementPlus+Jwt视频教程(火爆连载更新中..)_哔哩哔哩_bilibili项目介绍本课程采</div> </li> <li><a href="/article/1835178538907561984.htm" title="2.8.5Django --8.2 单表操作" target="_blank">2.8.5Django --8.2 单表操作</a> <span class="text-muted">寒暄_HX</span> <div>Django目录:https://www.jianshu.com/p/dc36f62b3dc5Yuan先生-Django模型层(1)Django与SQLAlchemy的ORM操作本质上是一样的,但是语法略有不同,如果是用Django进行开发最好使用原生的ORM或者直接使用原生SQL。创建表app06创建模型在app06中的models.py文件内,新建一个模板。one_exa.app06.mode</div> </li> <li><a href="/article/1835165891906596864.htm" title="关于django中几个重要的gunicorn worker的配置" target="_blank">关于django中几个重要的gunicorn worker的配置</a> <span class="text-muted">给我起把狙</span> <a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/gunicorn/1.htm">gunicorn</a> <div>关于django中几个重要的gunicornworker的配置一、worker_classworker_class是Gunicorn的配置参数之一,它指定了工作进程(worker)的类型。不同的worker_class提供了不同的并发模型,适合不同类型的应用场景。sync和gevent是两种常见的worker_class,它们的作用和区别如下:1.sync(同步worker)默认值:如果没有指定w</div> </li> <li><a href="/article/1835165892321832960.htm" title="gunicorn未重启,导致代码没拉到最新问题。" target="_blank">gunicorn未重启,导致代码没拉到最新问题。</a> <span class="text-muted">给我起把狙</span> <a class="tag" taget="_blank" href="/search/gunicorn/1.htm">gunicorn</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>问题描述:我的测试环境的django项目是用gunicorn启动的,然后我本地使用pythonmanagy.py启动的,新写了个接口,在本地测试没问题,在测试环境报404。我发现发了最新代码到远端,然后我在测试环境pull下来的时候出问题了,代码不是最新的,后来我的经理告诉我说要重启gunicorn的主进程给了我一条指令"kill-HUPgunicorn_pid(最小的)”,针对这个问题我大致做了</div> </li> <li><a href="/article/1835019650895802368.htm" title="python基于django/flask的NBA球员大数据分析与可视化python+java+node.js" target="_blank">python基于django/flask的NBA球员大数据分析与可视化python+java+node.js</a> <span class="text-muted">QQ_511008285</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a> <div>前端开发框架:vue.js数据库mysql版本不限后端语言框架支持:1java(SSM/springboot)-idea/eclipse2.Nodejs+Vue.js-vscode3.python(flask/django)--pycharm/vscode4.php(thinkphp/laravel)-hbuilderx数据库工具:Navicat/SQLyog等都可以本文针对NBA球员的大数据进行</div> </li> <li><a href="/article/1835019524521422848.htm" title="Java基于spring boot的国产电影数据分析与可视化python+java+node.js" target="_blank">Java基于spring boot的国产电影数据分析与可视化python+java+node.js</a> <span class="text-muted">QQ_511008285</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a> <div>前端开发框架:vue.js数据库mysql版本不限后端语言框架支持:1java(SSM/springboot)-idea/eclipse2.Nodejs+Vue.js-vscode3.python(flask/django)--pycharm/vscode4.php(thinkphp/laravel)-hbuilderx数据库工具:Navicat/SQLyog等都可以  该系统使用进行大数据处理和</div> </li> <li><a href="/article/1834965554214039552.htm" title="分布式框架Celery七(Django-Celery-Flower实现异步和定时爬虫及其监控邮件告警)" target="_blank">分布式框架Celery七(Django-Celery-Flower实现异步和定时爬虫及其监控邮件告警)</a> <span class="text-muted">yjjpp2301</span> <a class="tag" taget="_blank" href="/search/Celery/1.htm">Celery</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>Django中集成方式安装模块pipinstallDjango==3.2.22pipinstallcelerypipinstallredispipinstalleventlet#在windows环境下需要安装eventlet包-----------pipinstalldjango-celery-beatpipinstalldjango-celery-resultspipinstalldjango-</div> </li> <li><a href="/article/1834906052047499264.htm" title="基于django+vue代驾管理系统【开题报告+程序+论文】-计算机毕设" target="_blank">基于django+vue代驾管理系统【开题报告+程序+论文】-计算机毕设</a> <span class="text-muted">zhjie102</span> <a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a> <div>本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和人们生活水平的提高,私家车数量急剧增加,但随之而来的酒驾问题也日益严峻,严重威胁着道路交通安全与公众生命财产安全。为了有效遏制酒驾行为,代驾服务应运而生并迅速普及。然而,当前市场上的代驾服务大多依赖于电话预约、人工调度等传统方式,存在效率低下</div> </li> <li><a href="/article/1834897607902720000.htm" title="Python+Django毕业设计校园易购二手交易平台(程序+LW+部署)" target="_blank">Python+Django毕业设计校园易购二手交易平台(程序+LW+部署)</a> <span class="text-muted">Python、JAVA毕设程序源码</span> <a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>项目运行环境配置:Jdk1.8+Tomcat7.0+Mysql+HBuilderX(Webstorm也行)+Eclispe(IntelliJIDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:SSM+mybatis+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.ID</div> </li> <li><a href="/article/1834880085786718208.htm" title="python毕业设计作品:python闲置物品二手交易平台系统设计与实现毕业设计源代码(Django框架)" target="_blank">python毕业设计作品:python闲置物品二手交易平台系统设计与实现毕业设计源代码(Django框架)</a> <span class="text-muted">黄菊华老师</span> <a class="tag" taget="_blank" href="/search/%E6%AF%95%E8%AE%BE%E8%B5%84%E6%96%99/1.htm">毕设资料</a><a class="tag" taget="_blank" href="/search/python%E4%BA%8C%E6%89%8B%E4%BA%A4%E6%98%93%E5%B9%B3%E5%8F%B0%E7%B3%BB%E7%BB%9F/1.htm">python二手交易平台系统</a> <div>博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在CSD</div> </li> <li><a href="/article/1834793356543225856.htm" title="由于篇幅和复杂性限制,我无法在这里直接为你提供一个完整的、用多种编程语言实现的购物商城代码。但是,我可以为你概述如何使用几种流行的编程语言(如Python, JavaScript/Node.js, J" target="_blank">由于篇幅和复杂性限制,我无法在这里直接为你提供一个完整的、用多种编程语言实现的购物商城代码。但是,我可以为你概述如何使用几种流行的编程语言(如Python, JavaScript/Node.js, J</a> <span class="text-muted">NewmanEdwarda2</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>Python(后端,使用Flask或Django)Flask示例(后端API)gjijg.compythonfromflaskimportFlask,request,jsonifyapp=Flask(name)假设的数据库商品列表products=[{“id”:1,“name”:“苹果”,“price”:10.0},{“id”:2,“name”:“香蕉”,“price”:5.0},]@app.ro</div> </li> <li><a href="/article/1834739283336982528.htm" title="Django 安装指南" target="_blank">Django 安装指南</a> <span class="text-muted">lly202406</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Django安装指南Django是一个高级的PythonWeb框架,它鼓励快速开发和干净、实用的设计。本指南将详细介绍如何在不同的操作系统上安装Django,包括Windows、macOS和Linux。在Windows上安装Django先决条件Python:Django要求Python3.8或更高版本。可以从Python官网下载适用于Windows的Python安装程序。pip:Python的包管</div> </li> <li><a href="/article/1834573267847966720.htm" title="基于Python爬虫四川成都二手房数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状_django商品房数据分析论文(1)" target="_blank">基于Python爬虫四川成都二手房数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状_django商品房数据分析论文(1)</a> <span class="text-muted">莫莫Android开发</span> <a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>3.国外研究现状在国外,二手房数据可视化也是一个热门的研究领域。以美国为例,有很多公司和网站提供了专门的二手房数据可视化工具,如Zillow、Redfin等。这些工具通常提供房价趋势图、房价分布图、房源信息等功能,帮助用户更好地了解房市动态。综上所述,虽然国内外在二手房数据可视化方面已经有了一些研究成果,但对于四川成都地区的二手房市场还没有相关的研究和可视化系统。因此,本研究旨在设计并实现一个基于</div> </li> <li><a href="/article/1834551847789096960.htm" title="django中F()和Q()的用法" target="_blank">django中F()和Q()的用法</a> <span class="text-muted">给我起把狙</span> <a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>django中F()和Q()的用法一、F()表达式的详细介绍1.基本概念:F()表达式用于引用模型中的字段,允许你直接在数据库层面进行计算、比较或更新操作,而不需要将数据加载到Python内存中进行操作。这样可以提高性能,避免racecondition(数据竞争)。2.常见用法:1.字段间运算:你可以使用F()对同一记录中的不同字段进行运算。比如,你有一个模型Product,其中包含price和d</div> </li> <li><a href="/article/1834550710818140160.htm" title="Django 开发实战 2-2 模型 -创建模型类" target="_blank">Django 开发实战 2-2 模型 -创建模型类</a> <span class="text-muted">爱之泪伤</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/1.htm">项目实战</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>python开发实战-创建模型类一、介绍:二、根据迁移文件生成映射书库据表。三、查看数据库是否根据牵引文件的需求生成数据库,因此返回终端去连接`filmdatabase`数据库。四、最后,了解一些数据库的知识说明。一、介绍:  模型类被创建在"应用目录/models.py"文件中。模型类必须继承自Model类,位于包dango.db.models中。接下来首先以"影片-人物"管理为例进行演示。1定</div> </li> <li><a href="/article/1834550457662533632.htm" title="Vue + Django的人脸识别系统" target="_blank">Vue + Django的人脸识别系统</a> <span class="text-muted">DXSsssss</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/DRF/1.htm">DRF</a><a class="tag" taget="_blank" href="/search/tensorflow/1.htm">tensorflow</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB/1.htm">人脸识别</a> <div>最近在研究机器学习,刚好最近看了vue+Djangodrf的一些课程,学以致用,做了一个人脸识别系统。项目前端使用Vue框架,用到了elementui组件,写起来真是方便。比之前传统的dtl方便了太多。后端使用了drf,识别知识刚开始打算使用opencv+tensorflow,但是发现吧识别以后的结果返回到浏览器当中时使用opencv比较麻烦(主要是我太菜,想不到比较好的方法),因此最终使用了tf</div> </li> <li><a href="/article/1834550454785241088.htm" title="Django 创建好的模块怎么在后台显示" target="_blank">Django 创建好的模块怎么在后台显示</a> <span class="text-muted">u010373106</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/Django/1.htm">Django</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/sqlite/1.htm">sqlite</a> <div>1、配置模型及其需要显示的数据刚才创建好的tests的增删改查,在后台是不显示的,所以需要进行配置,在刚才创建好的模块里找到admin.py文件,在里面进行如下配置fromdjango.contribimportadminfrom.importmodelsfrom.modelsimportTests#Registeryourmodelshere.classTestsAdmin(admin.Mode</div> </li> <li><a href="/article/1834541635233476608.htm" title="【django】创建模型类(已更新)" target="_blank">【django】创建模型类(已更新)</a> <span class="text-muted">敲代码敲到头发茂密</span> <a class="tag" taget="_blank" href="/search/Django/1.htm">Django</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/ORM%E6%A1%86%E6%9E%B6/1.htm">ORM框架</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>ORM框架一、创建模型类二、字段类型说明三、字段选项说明四、外键五、迁移六、添加测试数据a、数据库:需要提前手动创建数据库b、数据表:与ORM框架中的模型类一一对应c、字段:模型类中的类属性(Field子类)d、记录:类似于模型类的多个实例一、创建模型类模型类创建在应用目录/models.py文件中。模型类必须继承Model类,位于包django.db.models中。接下来首先以“影片-人物”管</div> </li> <li><a href="/article/1834535205646462976.htm" title="Django+Vue基于OpenCV的人脸识别系统的设计与实现" target="_blank">Django+Vue基于OpenCV的人脸识别系统的设计与实现</a> <span class="text-muted">赵广陆</span> <a class="tag" taget="_blank" href="/search/project/1.htm">project</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/opencv/1.htm">opencv</a> <div>目录1项目介绍2项目截图3核心代码3.1需要的环境3.2Django接口层3.3实体类3.4config.ini3.5启动类3.5Vue4数据库表设计5文档参考6计算机毕设选题推荐7源码获取1项目介绍博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+粉丝,超300w访问量,专注于大学生项目实战开发、讲解和答疑辅导,对于专业性数据证明一切!主要项目:javaweb、</div> </li> <li><a href="/article/1834400467820572672.htm" title="Django核心面试题" target="_blank">Django核心面试题</a> <span class="text-muted">闲人编程</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98%E9%9D%A2%E8%AF%95/1.htm">程序员面试</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>Django核心面试题Django核心面试题Django核心面试题1.Django的MVT架构是什么?2.如何创建Django项目和应用?3.DjangoORM是什么?4.什么是Django的middleware?举例说明。5.Django中的静态文件如何处理?6.如何定义Django模型?7.什么是Django的QuerySet?如何使用?8.如何进行Django的数据库迁移?9.Django中</div> </li> <li><a href="/article/1834367946206572544.htm" title="Django——多apps目录情况下的app注册" target="_blank">Django——多apps目录情况下的app注册</a> <span class="text-muted">叫我DPT</span> <a class="tag" taget="_blank" href="/search/Django%E6%A1%86%E6%9E%B6%E7%9F%A5%E8%AF%86%E7%82%B9/1.htm">Django框架知识点</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>文章目录多apps目录下的app注册方式1-添加python导包路径方式2-修改AppConfig类名多apps目录下的app注册方式1-添加python导包路径importsyssys.path.insert(0,str(BASE_DIR/"apps"))print(sys.path)INSTALLED_APPS=['django.contrib.admin','django.contrib.a</div> </li> <li><a href="/article/1834367819840581632.htm" title="Django项目中log日志的配置" target="_blank">Django项目中log日志的配置</a> <span class="text-muted">叫我DPT</span> <a class="tag" taget="_blank" href="/search/Django%E9%A1%B9%E7%9B%AE%E4%B8%AD%E5%B8%B8%E7%94%A8%E7%BB%84%E4%BB%B6/1.htm">Django项目中常用组件</a><a class="tag" taget="_blank" href="/search/%E8%84%9A%E6%9C%AC/1.htm">脚本</a><a class="tag" taget="_blank" href="/search/%E5%8A%9F%E8%83%BD/1.htm">功能</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/logging/1.htm">logging</a> <div>文章目录日志配置模板日志处理器Handlers日志配置模板#日志LOGGING={'version':1,#使用的日志模块的版本,目前官方提供的只有版本1,但是官方有可能会升级,为了避免升级出现的版本问题,所以这里固定为1'disable_existing_loggers':False,#是否禁用其他的已经存在的日志功能?肯定不能,有可能有些第三方模块在调用,所以禁用了以后,第三方模块无法捕获自身</div> </li> <li><a href="/article/1834285986738171904.htm" title="Django:Python高级Web框架详解及参数设置" target="_blank">Django:Python高级Web框架详解及参数设置</a> <span class="text-muted">零 度°</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Django是一个高级的PythonWeb框架,它鼓励快速开发和简洁实用的设计。Django遵循MVC设计模式,提供了一套完整的解决方案,用于构建复杂的、数据库驱动的网站。Django的主要特点自动管理数据库:通过ORM(对象关系映射)自动管理数据库。自动生成站点地图:支持搜索引擎优化(SEO)。用户身份认证:内置用户认证系统。中间件支持:强大的中间件支持,可以处理请求和响应。跨站请求伪造(CSR</div> </li> <li><a href="/article/1834190698161729536.htm" title="Python轻量级ORM框架——peewee" target="_blank">Python轻量级ORM框架——peewee</a> <span class="text-muted">半生浮名只是虚妄</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>这里写目录标题Python中常用的ORM框架peewee使用经验从数据库中导出模型查询统计类查询优化子查询参考文章Python中常用的ORM框架SQLALchemy:重量级框架,适合企业级开发,容易与任意Web框架集成,学习成本更高DjangoORM:Django框架中内嵌的ORM模块,易学易用,只适合Django项目使用peewee:轻量级框架,适合个人开发,容易与任意Web框架集成,API类似</div> </li> <li><a href="/article/1833937451014516736.htm" title="Ubuntu系统nginx和uwsgi常用命令(部署网站相关命令)" target="_blank">Ubuntu系统nginx和uwsgi常用命令(部署网站相关命令)</a> <span class="text-muted">我不是大佬zvj</span> <a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>以下是我自己在学习使用Ubuntu操作系统部署pythonflask和django网站时常用的命令,作为学习笔记,记录一下,写的比较简单,还有啥需要补充的话欢迎留言。路径相关#进入项目路径cd /var/www/html/Podcaster#nginx配置文件路径‏/etc/nginx/sites-enabled/‌‍default防火墙#查看已经开放的端口sudoufwstatus#打开端口su</div> </li> <li><a href="/article/1833814523505635328.htm" title="2025毕业设计指南:如何用Hadoop构建超市进货推荐系统?大数据分析助力精准采购" target="_blank">2025毕业设计指南:如何用Hadoop构建超市进货推荐系统?大数据分析助力精准采购</a> <span class="text-muted">计算机编程指导师</span> <a class="tag" taget="_blank" href="/search/Java%E5%AE%9E%E6%88%98%E9%9B%86/1.htm">Java实战集</a><a class="tag" taget="_blank" href="/search/Python%E5%AE%9E%E6%88%98%E9%9B%86/1.htm">Python实战集</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE%E5%AE%9E%E6%88%98%E9%9B%86/1.htm">大数据实战集</a><a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%BF%9B%E8%B4%A7/1.htm">进货</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>✍✍计算机编程指导师⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java实战|SpringBoot/SSMPython实战项目|Django微信小程序/安卓实战项目大数据实战项目⚡⚡文末获取源码文章目录⚡⚡文末获取源码基于hadoop的超市进货推荐系</div> </li> <li><a href="/article/1833706099132428288.htm" title="Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术" target="_blank">Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术</a> <span class="text-muted">Switch616</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a><a class="tag" taget="_blank" href="/search/fastapi/1.htm">fastapi</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>PythonWeb框架篇:Flask、Django、FastAPI介绍及其核心技术目录FlaskFlask核心概念(路由、视图函数、模板渲染)FlaskBlueprint模块化应用Flask扩展(Flask-SQLAlchemy、Flask-WTF、Flask-Migrate等)DjangoDjango项目架构DjangoORM及模型定义Django中间件Django信号机制DjangoForm和</div> </li> <li><a href="/article/1833702066061668352.htm" title="python selenium post,是否可以在Selenium中捕获POST数据?" target="_blank">python selenium post,是否可以在Selenium中捕获POST数据?</a> <span class="text-muted">weixin_39600328</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/selenium/1.htm">selenium</a><a class="tag" taget="_blank" href="/search/post/1.htm">post</a> <div>I'mworkingwiththeSeleniumWebDriverToolandamwonderingifthistoolprovidesameansforcapturingthePOSTdatageneratedwhensubmittingaform.I'musingthedjangotestframeworktotestthatmydataisprocessedcorrectlyontheb</div> </li> <li><a href="/article/94.htm" title="PHP,安卓,UI,java,linux视频教程合集" target="_blank">PHP,安卓,UI,java,linux视频教程合集</a> <span class="text-muted">cocos2d-x小菜</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>╔-----------------------------------╗┆                           </div> </li> <li><a href="/article/221.htm" title="各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。" target="_blank">各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。</a> <span class="text-muted">bozch</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/.net+mvc/1.htm">.net mvc</a> <div>在.net mvc5中,在执行某一操作的时候,出现了如下错误:       各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。 经查询当前的操作与错误内容无关,经过对错误信息的排查发现,事故出现在数据库迁移上。 回想过去: 在迁移之前已经对数据库进行了添加字段操作,再次进行迁移插入XXX字段的时候,就会提示如上错误。  &</div> </li> <li><a href="/article/348.htm" title="Java 对象大小的计算" target="_blank">Java 对象大小的计算</a> <span class="text-muted">e200702084</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>                          Java对象的大小 如何计算一个对象的大小呢?    </div> </li> <li><a href="/article/475.htm" title="Mybatis Spring" target="_blank">Mybatis Spring</a> <span class="text-muted">171815164</span> <a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a> <div>ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); CustomerService userService = (CustomerService) ac.getBean("customerService"); Customer cust</div> </li> <li><a href="/article/602.htm" title="JVM 不稳定参数" target="_blank">JVM 不稳定参数</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a> <div>        -XX 参数被称为不稳定参数,之所以这么叫是因为此类参数的设置很容易引起JVM 性能上的差异,使JVM 存在极大的不稳定性。当然这是在非合理设置的前提下,如果此类参数设置合理讲大大提高JVM 的性能及稳定性。        可以说“不稳定参数”</div> </li> <li><a href="/article/729.htm" title="用户自动登录网站" target="_blank">用户自动登录网站</a> <span class="text-muted">永夜-极光</span> <a class="tag" taget="_blank" href="/search/%E7%94%A8%E6%88%B7/1.htm">用户</a> <div>1.目标:实现用户登录后,再次登录就自动登录,无需用户名和密码 2.思路:将用户的信息保存为cookie            每次用户访问网站,通过filter拦截所有请求,在filter中读取所有的cookie,如果找到了保存登录信息的cookie,那么在cookie中读取登录信息,然后直接</div> </li> <li><a href="/article/856.htm" title="centos7 安装后失去win7的引导记录" target="_blank">centos7 安装后失去win7的引导记录</a> <span class="text-muted">程序员是怎么炼成的</span> <a class="tag" taget="_blank" href="/search/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">操作系统</a> <div>1.使用root身份(必须)打开 /boot/grub2/grub.cfg 2.找到 ### BEGIN /etc/grub.d/30_os-prober ###   在后面添加    menuentry "Windows 7 (loader) (on /dev/sda1)" { </div> </li> <li><a href="/article/983.htm" title="Oracle 10g 官方中文安装帮助文档以及Oracle官方中文教程文档下载" target="_blank">Oracle 10g 官方中文安装帮助文档以及Oracle官方中文教程文档下载</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>Oracle 10g 官方中文安装帮助文档下载:http://download.csdn.net/tag/Oracle%E4%B8%AD%E6%96%87API%EF%BC%8COracle%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%EF%BC%8Coracle%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3 Oracle 10g 官方中文教程</div> </li> <li><a href="/article/1110.htm" title="JavaEE开源快速开发平台G4Studio_V3.2发布了" target="_blank">JavaEE开源快速开发平台G4Studio_V3.2发布了</a> <span class="text-muted">無為子</span> <a class="tag" taget="_blank" href="/search/AOP/1.htm">AOP</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/javaee/1.htm">javaee</a><a class="tag" taget="_blank" href="/search/G4Studio/1.htm">G4Studio</a> <div>  我非常高兴地宣布,今天我们最新的JavaEE开源快速开发平台G4Studio_V3.2版本已经正式发布。大家可以通过如下地址下载。   访问G4Studio网站 http://www.g4it.org   G4Studio_V3.2版本变更日志 功能新增 (1).新增了系统右下角滑出提示窗口功能。 (2).新增了文件资源的Zip压缩和解压缩</div> </li> <li><a href="/article/1237.htm" title="Oracle常用的单行函数应用技巧总结" target="_blank">Oracle常用的单行函数应用技巧总结</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/%E6%97%A5%E6%9C%9F%E5%87%BD%E6%95%B0/1.htm">日期函数</a><a class="tag" taget="_blank" href="/search/%E8%BD%AC%E6%8D%A2%E5%87%BD%E6%95%B0%28%E6%A0%B8%E5%BF%83%29/1.htm">转换函数(核心)</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%97%E5%87%BD%E6%95%B0/1.htm">数字函数</a><a class="tag" taget="_blank" href="/search/%E9%80%9A%E7%94%A8%E5%87%BD%E6%95%B0%28%E6%A0%B8%E5%BF%83%29/1.htm">通用函数(核心)</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E7%AC%A6%E5%87%BD%E6%95%B0/1.htm">字符函数</a> <div>单行函数;   字符函数,数字函数,日期函数,转换函数(核心),通用函数(核心) 一:字符函数: .UPPER(字符串) 将字符串转为大写 .LOWER (字符串) 将字符串转为小写 .INITCAP(字符串) 将首字母大写 .LENGTH (字符串) 字符串的长度 .REPLACE(字符串,'A','_') 将字符串字符A转换成_ </div> </li> <li><a href="/article/1364.htm" title="Mockito异常测试实例" target="_blank">Mockito异常测试实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a><a class="tag" taget="_blank" href="/search/mockito/1.htm">mockito</a> <div>Mockito异常测试实例: package com.bijian.study; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.Assert; import org.junit.Test; import org.mockito.</div> </li> <li><a href="/article/1491.htm" title="GA与量子恒道统计" target="_blank">GA与量子恒道统计</a> <span class="text-muted">Bill_chen</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E6%B5%8F%E8%A7%88%E5%99%A8/1.htm">浏览器</a><a class="tag" taget="_blank" href="/search/%E7%99%BE%E5%BA%A6/1.htm">百度</a><a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a><a class="tag" taget="_blank" href="/search/%E9%98%B2%E7%81%AB%E5%A2%99/1.htm">防火墙</a> <div>前一阵子,统计**网址时,Google Analytics(GA) 和量子恒道统计(也称量子统计),数据有较大的偏差,仔细找相关资料研究了下,总结如下:   为何GA和量子网站统计(量子统计前身为雅虎统计)结果不同? 首先:没有一种网站统计工具能保证百分之百的准确出现该问题可能有以下几个原因:(1)不同的统计分析系统的算法机制不同;(2)统计代码放置的位置和前后</div> </li> <li><a href="/article/1618.htm" title="【Linux命令三】Top命令" target="_blank">【Linux命令三】Top命令</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/linux%E5%91%BD%E4%BB%A4/1.htm">linux命令</a> <div>Linux的Top命令类似于Windows的任务管理器,可以查看当前系统的运行情况,包括CPU、内存的使用情况等。如下是一个Top命令的执行结果:     top - 21:22:04 up 1 day, 23:49, 1 user, load average: 1.10, 1.66, 1.99 Tasks: 202 total, 4 running, 198 sl</div> </li> <li><a href="/article/1745.htm" title="spring四种依赖注入方式" target="_blank">spring四种依赖注入方式</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>  平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我</div> </li> <li><a href="/article/1872.htm" title="angular.injector" target="_blank">angular.injector</a> <span class="text-muted">boyitech</span> <a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/AngularJS+API/1.htm">AngularJS API</a> <div>angular.injector   描述: 创建一个injector对象, 调用injector对象的方法可以获得angular的service, 或者用来做依赖注入.   使用方法: angular.injector(modules, [strictDi])   参数详解: Param Type Details mod</div> </li> <li><a href="/article/1999.htm" title="java-同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待" target="_blank">java-同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/Integer/1.htm">Integer</a> <div> public class PC { /** * 题目:生产者-消费者。 * 同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待。 */ private static final Integer[] val=new Integer[10]; private static</div> </li> <li><a href="/article/2126.htm" title="使用Struts2.2.1配置" target="_blank">使用Struts2.2.1配置</a> <span class="text-muted">Chen.H</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a> <div>Struts2.2.1 需要如下 jar包: commons-fileupload-1.2.1.jar commons-io-1.3.2.jar commons-logging-1.0.4.jar freemarker-2.3.16.jar javassist-3.7.ga.jar ognl-3.0.jar spring.jar struts2-core-2.2.1.jar struts2-sp</div> </li> <li><a href="/article/2253.htm" title="[职业与教育]青春之歌" target="_blank">[职业与教育]青春之歌</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E6%95%99%E8%82%B2/1.htm">教育</a> <div>        每个人都有自己的青春之歌............但是我要说的却不是青春...        大家如果在自己的职业生涯没有给自己以后创业留一点点机会,仅仅凭学历和人脉关系,是难以在竞争激烈的市场中生存下去的....   &nbs</div> </li> <li><a href="/article/2380.htm" title="oracle连接(join)中使用using关键字" target="_blank">oracle连接(join)中使用using关键字</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/JOIN/1.htm">JOIN</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/using/1.htm">using</a> <div>在oracle连接(join)中使用using关键字 34. View the Exhibit and examine the structure of the ORDERS and ORDER_ITEMS tables. Evaluate the following SQL statement: SELECT oi.order_id, product_id, order_date FRO</div> </li> <li><a href="/article/2507.htm" title="NIO示例" target="_blank">NIO示例</a> <span class="text-muted">daysinsun</span> <a class="tag" taget="_blank" href="/search/nio/1.htm">nio</a> <div>NIO服务端代码: public class NIOServer { private Selector selector; public void startServer(int port) throws IOException { ServerSocketChannel serverChannel = ServerSocketChannel.open(</div> </li> <li><a href="/article/2634.htm" title="C语言学习homework1" target="_blank">C语言学习homework1</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/homework/1.htm">homework</a> <div>0、 课堂练习做完 1、使用sizeof计算出你所知道的所有的类型占用的空间。 int x; sizeof(x);   sizeof(int);   # include <stdio.h> int main(void) { int x1; char x2; double x3; float x4; printf(&quo</div> </li> <li><a href="/article/2761.htm" title="select in order by , mysql排序" target="_blank">select in order by , mysql排序</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>If i select like this: SELECT id FROM users WHERE id IN(3,4,8,1); This by default will select users in this order 1,3,4,8, I would like to select them in the same order that i put IN() values so: </div> </li> <li><a href="/article/2888.htm" title="页面校验-新建项目" target="_blank">页面校验-新建项目</a> <span class="text-muted">fanxiaolong</span> <a class="tag" taget="_blank" href="/search/%E9%A1%B5%E9%9D%A2%E6%A0%A1%E9%AA%8C/1.htm">页面校验</a> <div>$(document).ready( function() { var flag = true; $('#changeform').submit(function() { var projectScValNull = true; var s =""; var parent_id = $("#parent_id").v</div> </li> <li><a href="/article/3015.htm" title="Ehcache(02)——ehcache.xml简介" target="_blank">Ehcache(02)——ehcache.xml简介</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/ehcache/1.htm">ehcache</a><a class="tag" taget="_blank" href="/search/ehcache.xml/1.htm">ehcache.xml</a><a class="tag" taget="_blank" href="/search/%E7%AE%80%E4%BB%8B/1.htm">简介</a> <div>ehcache.xml简介          ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheManager的配置信息的。根据之前我们在《Ehcache简介》一文中对CacheManager的介绍我们知道一切Ehcache的应用都是从CacheManager开始的。在不指定配置信</div> </li> <li><a href="/article/3142.htm" title="junit 4.11中三个新功能" target="_blank">junit 4.11中三个新功能</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>junit 4.11中两个新增的功能,首先是注解中可以参数化,比如 import static org.junit.Assert.assertEquals; import java.util.Arrays; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runn</div> </li> <li><a href="/article/3269.htm" title="国外程序员爱用苹果Mac电脑的10大理由" target="_blank">国外程序员爱用苹果Mac电脑的10大理由</a> <span class="text-muted">php教程分享</span> <a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/unix/1.htm">unix</a><a class="tag" taget="_blank" href="/search/Microsoft/1.htm">Microsoft</a><a class="tag" taget="_blank" href="/search/perl/1.htm">perl</a> <div>Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里。普通用户喜欢 Mac 可以理解,毕竟 Mac 设计美观,简单好用,没有病毒。那么为什么专业人士也对 Mac 情有独钟呢?从个人使用经验来看我想有下面几个原因: 1、Mac OS X 是基于 Unix 的 这一点太重要了,尤其是对开发人员,至少对于我来说很重要,这意味着Unix 下一堆好用的工具都可以随手捡到。如果你是个 wi</div> </li> <li><a href="/article/3396.htm" title="位运算、异或的实际应用" target="_blank">位运算、异或的实际应用</a> <span class="text-muted">wenjinglian</span> <a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a> <div>一. 位操作基础,用一张表描述位操作符的应用规则并详细解释。       二. 常用位操作小技巧,有判断奇偶、交换两数、变换符号、求绝对值。       三. 位操作与空间压缩,针对筛素数进行空间压缩。    &n</div> </li> <li><a href="/article/3523.htm" title="weblogic部署项目出现的一些问题(持续补充中……)" target="_blank">weblogic部署项目出现的一些问题(持续补充中……)</a> <span class="text-muted">Everyday都不同</span> <a class="tag" taget="_blank" href="/search/weblogic%E9%83%A8%E7%BD%B2%E5%A4%B1%E8%B4%A5/1.htm">weblogic部署失败</a> <div>好吧,weblogic的问题确实……   问题一: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [zip:E:/weblogic/user_projects/domains/base_domain/serve</div> </li> <li><a href="/article/3650.htm" title="tomcat7性能调优(01)" target="_blank">tomcat7性能调优(01)</a> <span class="text-muted">toknowme</span> <a class="tag" taget="_blank" href="/search/tomcat7/1.htm">tomcat7</a> <div>    Tomcat优化: 1、最大连接数最大线程等设置 <Connector port="8082" protocol="HTTP/1.1"                useBodyEncodingForURI="t</div> </li> <li><a href="/article/3777.htm" title="PO VO DAO DTO BO TO概念与区别" target="_blank">PO VO DAO DTO BO TO概念与区别</a> <span class="text-muted">xp9802</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/%E9%A2%86%E5%9F%9F%E6%A8%A1%E5%9E%8B/1.htm">领域模型</a> <div>O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。 它们的关系应该是相互独立的,一个VO可以只是PO的部分,也可以是多个PO构成,同样也可以等同于一个PO(指的是他们的属性)。这样,PO独立出来,数据持</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>