django每页多少条目的简单介绍

兄弟姐妹哪位知道,django每页多少条目的简单介绍
最新回答
薅藤已蔓蔆

2024-11-02 11:17:27

本篇文章给大家谈谈django每页多少条目,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

1、python怎么搭建django框架2、django的request,response,session的常用方法函数,不用多,帮忙列一下谢谢3、我怎样才能防止数据库条目的并发修改4、在Django models.py,什么是默认值,空值和空白之间的区别5、如何有效的遍历django的QuerySetpython怎么搭建django框架

运行环境

Windows 7(64位) + Python 2.7 + Django 1.7.1

1.安装django框架

当然你首先要有python环境,对于学python的朋友们这个就不多说了~~

我使用的是setuptools工具来安装的,setuptools是python中安装第三方模块常用的安装工具

1.1安装setuptools工具(如果会安装的可以直接跳过)

先从这个地址下载ez_setup.py:

(在页面最下面)

我下载的是setuptools-7.0.zip,将其解压,将解压的setuptools-7.0文件放到一个目录,我这里假定将其放到C:\workspace目录下

打开命令行cmd,在cmd中切换到C:\workspace\setuptools-7.0,即setuptools-7.0安装目录

运行命令:

python ez_setup.py

该命令会安装setuptools工具,安装后打开你的python安装目录下的Scripts目录(我的是C:\Python27\Scripts),会看到easy_install.exe等文件

注意将python安装目录下的Scripts目录(我的是C:\Python27\Scripts)添加到环境变量path,否则下面的easy_install命令会报错

1.2安装django框架

在cmd中输入:

easy_install django

有的安装过程可能会提示缺少vc++包,根据提示网址(我忘了~)下载包,我下载的是VCForPython27.msi,安装vc++后再执行安装

这样就自动安装了django,是不是很方便,哈哈

2.创建django项目,这里假定在c:\workspace\djangoTest下创建(和java有点差别,java是直接创建项目就可以了,python是要先创建项目再在项目里创建app)

进入c:\workspace\djangoTest目录,输入:

django-admin startproject mytodo #网上很多是python django-admin.py startproject mytodo,版本不一样可能命令有细微差别

就创建了mytodo项目

3.启动调试服务器

进入c:\workspace\djangoTest\djangoTest\mytodo目录:

cd mytodo

然后输入:

python manage.py runserver

在浏览器中输入,看能否访问页面

4.创建app

输入命令:python manage.py startapp todo

就在mytodo项目下创建了一个app,即todo

编辑mytodo/settings.py文件,在INSTALLED_APPS添加条目todo

INSTALLED_APPS = (

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.sites',

'todo',

)

即在最后添加一行todo(有的版本是项目名+app名,即mytodo.todo)

再次输入:python manage.py runserver看看你app是否配置好了,养成边写边测试的好习惯,哈哈~

5.配置数据库

django默认的是使用SQLite数据库作为后台数据库,仍然打开mytodo/settings.py,可以看到下面一段:

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.sqlite3',

'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

}

}

这就是django项目的数据库配置,默认是使用SQLite,我们就使用使用默认配置,安装SQLite数据库,不需要修改配置文件

听到又要安装数据库,大家肯定又觉得好复杂,其实在python里安装三方模块,数据库什么的很简单,一条命令就可以搞定了~~

输入命令:

easy_install pysqlite

这样就安装了SQLite数据库

安装完数据库,我们也测试一下,输入命令:

python manage.py syncdb

出现successfully提示就安装成功了,打开mytodo目录,看看里面是否有一个db.sqlite3文件,这就是上面配置的数据库文件

django的request,response,session的常用方法函数,不用多,帮忙列一下谢谢

HttpRequest对象

HttpRequest 表示来自某客户端的一个单独的HTTP请求。

HttpRequest实例的属性包含了关于此次请求的大多数重要信息(详见表H-1)。 除了session外的所有属性都应该认为是只读的.

表 H-1. HttpRequest对象的属性

属性

描述

path表示提交请求页面完整地址的字符串, 不包括域名,如 "/music/bands/the_beatles/" 。

method

表示提交请求使用的HTTP方法。 它总是大写的。例如:

if request.method == 'GET':

do_something()

elif request.method == 'POST':

do_something_else()

GET一个类字典对象,包含所有的HTTP的GET参数的信息。 见 QueryDict 文档。

POST

一个类字典对象,包含所有的HTTP的POST参数的信息。 见 QueryDict 文档。

通过POST提交的请求有可能包含一个空的 POST 字典, 也就是说, 一个通过POST方法提交的表单可能不包含数据。 因此,不应该使用 if request.POST 来判断POST方法的使用, 而是使用if request.method == "POST" (见表中的 method 条目)。

注意: POST 并 不 包含文件上传信息。 见 FILES 。

REQUEST

为了方便而创建,这是一个类字典对象,先搜索 POST , 再搜索 GET 。 灵感来自于PHP的$_REQEUST 。

例如, 若 GET = {"name": "john"} , POST = {"age": '34'} , REQUEST["name"] 会是 "john" ,REQUEST["age"] 会是 "34" 。

强烈建议使用 GET 和 POST ,而不是 REQUEST 。 这是为了向前兼容和更清楚的表示。

COOKIES一个标准的Python字典,包含所有cookie。 键和值都是字符串。cookie使用的更多信息见第12章。

FILES

一个类字典对象,包含所有上传的文件。 FILES 的键来自 input type="file" name="" / 中的name 。 FILES 的值是一个标准的Python字典, 包含以下三个键:

filename :字符串,表示上传文件的文件名。

content-type :上传文件的内容类型。

content :上传文件的原始内容。

注意 FILES 只在请求的方法是 POST ,并且提交的 form 包含 enctype="multipart/form-data" 时 才包含数据。否则, FILES 只是一个空的类字典对象。

META

一个标准的Python字典,包含所有有效的HTTP头信息。 有效的头信息与客户端和服务器有关。 这里有几个例子:

CONTENT_LENGTH

CONTENT_TYPE

QUERY_STRING :未解析的原始请求字符串。

REMOTE_ADDR :客户端IP地址。

REMOTE_HOST :客户端主机名。

SERVER_NAME :服务器主机名。

SERVER_PORT :服务器端口号。

在 META 中有效的任一HTTP头信息都是带有 HTTP_ 前缀的 键,例如:

HTTP_ACCEPT_ENCODING

HTTP_ACCEPT_LANGUAGE

HTTP_HOST :客户端发送的 Host 头信息。

HTTP_REFERER :被指向的页面,如果存在的。

HTTP_USER_AGENT :客户端的user-agent字符串。

HTTP_X_BENDER : X-Bender 头信息的值, 如果已设的话。

user

一个 django.contrib.auth.models.User 对象表示 当前登录用户。 若当前用户尚未登录, user 会设为 django.contrib.auth.models.AnonymousUser 的一个实例。 可以将它们与is_authenticated() 区别开:

if request.user.is_authenticated():

# Do something for logged-in users.

else:

# Do something for anonymous users.

user 仅当Django激活 AuthenticationMiddleware 时有效。

关于认证和用户的完整细节,见第12章。

session一个可读写的类字典对象,表示当前session。 仅当Django已激活session支持时有效。 见第12章。

raw_post_dataPOST的原始数据。 用于对数据的复杂处理。

Request对象同样包含了一些有用的方法,见表H-2。

表 H-2. HttpRequest 的方法

方法

描述

__getitem__(key)

请求所给键的GET/POST值,先查找POST,然后是GET。 若键不存在,则引发异常 KeyError。

该方法使用户可以以访问字典的方式来访问一个 HttpRequest 实例。

例如, request["foo"] 和先检查 request.POST["foo"] 再检查 request.GET["foo"] 一 样。

has_key()返回 True 或 False , 标识 request.GET 或 request.POST 是否包含所给的 键。

get_full_path()返回 path ,若请求字符串有效,则附加于其后。 例如,"/music/bands/the_beatles/?print=true" 。

is_secure()如果请求是安全的,则返回 True 。 也就是说,请求是以HTTPS的形式提交的。

QueryDict 对象

在一个 HttpRequest 对象中, GET 和 POST 属性都是 django.http.QueryDict 的实例。 QueryDict 是一个类似于字典的类,专门用来处理用一个键的多值。当处理一些HTML表单中的元素,特别是 select multiple="multiple" 之类传递同一key的多值的元素时,就需要这个类了。

translating....

QueryDict 实例是不可变的,除非创建了一个 copy() 副本。也就是说不能直接更改 request.POST 和 request.GET 的属性。

QueryDict 实现了所有标准的字典的方法,因为它正是字典的一个子类。与其不同的东西都已在表H-3中列出。

表 H-3. QueryDicts 与标准字典的区别

方法

与标准字典实现的不同

__getitem__与一个字典一样。但是,当一个键有多个值时, __getitem__() 返回最后一个值。

__setitem__将所给键的值设为 [value] (一个只有一个 value 元素的 Python列表)。 注意,因对其它的字典函数有副作用,故它只能被称 为一个可变的 QueryDict (通过 copy() 创建)。

get()如果一个键多个值,和 __getitem__ 一样, get() 返回 最后一个值。

update()

参数是一个 QueryDict 或标准字典。 和标准字典的

update 不同,这个方法*增加*而不是替换一项内容:

q = QueryDict('a=1')

q = q.copy() # 使其可变

q.update({'a': '2'})

q.getlist('a')

['1', '2']

q['a'] # 返回最后一个值

['2']

items()

和标准字典的 items() 方法一样, 不同的是它和 __getitem()__ 一样,返回最后一个值:

q = QueryDict('a=1a=2a=3')

q.items()

[('a', '3')]

values()和标准字典的 values() 方法一样, 不同的是它和 __getitem()__ 一样,返回最后一个值。

另外, QueryDict 还有在表H-4中列出的方法。

表 H-4. 附加的 (非字典的) QueryDict 方法

方法

描述

copy()返回一个对象的副本,使用的是Python标准库中的 copy.deepcopy() 。 该副本是可变的, 也就是说,你能改变它的值。

getlist(key)以Python列表的形式返回所请求键的数据。 若键不存在则返回空列表。 它保证了一定会返回某种形式的list。

setlist(key, list_)将所给键的键值设为 list_ (与 __setitem__() 不同)。

appendlist(key, item)在 key 相关的list上增加 item 。

setlistdefault(key, l)和 setdefault 一样, 不同的是它的第二个参数是 一个列表,而不是一个值。

lists()

和 items() 一样, 不同的是它以一个列表的形式 返回字典每一个成员的所有值。 例如:

q = QueryDict('a=1a=2a=3')

q.lists()

[('a', ['1', '2', '3'])]

urlencode()返回一个请求字符串格式的数据字符串 (如, "a=2b=3b=5" )。

一个完整的例子

例如, 给定这个HTML表单:

form action="/foo/bar/" method="post"

input type="text" name="your_name" /

select multiple="multiple" name="bands"

option value="beatles"The Beatles/option

option value="who"The Who/option

option value="zombies"The Zombies/option

/select

input type="submit" /

/form

如果用户在 your_name 中输入 "John Smith" ,并且在多选框中同时选择了The Beatles和The Zombies,那么以下就是Django的request对象所拥有的:

request.GET

{}

request.POST

{'your_name': ['John Smith'], 'bands': ['beatles', 'zombies']}

request.POST['your_name']

'John Smith'

request.POST['bands']

'zombies'

request.POST.getlist('bands')

['beatles', 'zombies']

request.POST.get('your_name', 'Adrian')

'John Smith'

request.POST.get('nonexistent_field', 'Nowhere Man')

'Nowhere Man'

使用时请注意:

GET , POST , COOKIES , FILES , META , REQUEST , raw_post_data 和 user 这些属性都是延迟加载的。 也就是说除非代码中访问它们,否则Django并不会花费资源来计算这些属性值。

我怎样才能防止数据库条目的并发修改

1. 事实上,交易不帮你在这里多...除非你想有运行在多个HTTP请求(你很可能不希望)的交易。 有什么用在这些情况下是“乐观锁定”。 Django的ORM不支持,据我所知。但一直以来关于添加此功能。 那么,你是你自己的。基本上,你应该做的就是添加一个“版本”字段,你的模型,并把它传递给一个隐藏字段。正常周期的更新是: 读取数据并显示给 用户可以修改数据 用户发布的数据 该应用程序将其保存回数据库。 乐观锁,当你保存数据,你检查,如果你得到了从后面的版本是作为一个在数据库中,然后更新数据库和版本。如果它们不是,那有一直以来被加载的数据的变化。 你可以做到这一点与像一个单一的SQL调用:UPDATE ... WHERE version = 'version_from_user';

这个调用将更新数据库只有在版本仍然是

2. 我就是这样做的Django的乐观锁:updated = Entry.objects.filter(Q(id=e.id)Q(version=e.version))\

.update(updated_field=new_value, version=e.version+1)

if not updated:

raise ConcurrentModificationException()

上面列出的代码可以在自定义管理。 我提出以下假设: 筛选()。update()方法会导致在一个单一的数据库查询过滤器是懒惰 数据库查询是原子 这些假设都足以确保没有其他人之前已经更新了条目。如果有多个行被更新这样你的交易。 警告Django的文件: 请注意,update()方法是 直接转换为SQL 这是一个批量操作 直接更新。它不运行任何 保存(您的模型)的方法,或发出 该pre_save或post_save信号

3. 这个问题是有点老了,我的回答有点晚,但经过我的理解使用这个已被固定在Django 1.4:select_for_update(nowait=True)

看到文档 返回一个QuerySet,将锁定行,直到事务结束,产生一个SELECT ...有关支持的数据库UPDATE的SQL。 通常情况下,如果另一个事务已获得所选择的行上的锁,则查询将阻塞,直到锁被释放。如果这不是你想要的行为,请致电select_for_update(NOWAIT=TRUE)。这将使调用非阻塞的。如果已经获取了冲突的锁被另一个事务时的QuerySet进行评估,DatabaseError的将得到提升。 当然,这只会工作,如果后端支持的“选择更新”功能,这对于例如SQLite不。不幸的是:nowait=True不支持MySql的,有你有nowait=False,这只会阻塞,直到锁被释放。

4. 对于未来的参考,退房离开的时候(在浏览器中,例如崩溃)的页面,并锁定它锁定的方式,不留下永恒的锁,通过javascript的解锁的混合物。下

5. 你应该Django的交易中间件,至少,甚至不管这个问题。 至于你实际有编辑数据的问题...是的,使用锁。或: 检查什么版本正在更新对(这样做牢固,不能简单地破解系统说,他们正在更新的最新副本!),且仅当该版本是最新的更新。否则,返回一个新页面与原来的版本,他们编辑,他们提交的版本,和别人写的新版本(S)。问他们变成一体,完全取决于最新的版本。你可以尝试类似的diff +补丁工具集,但你需要有方法工作失败的案例,无论如何,所以开始了。此外,您将需要保存的版本历史记录,并允许管理员恢复的变化,在无意的情况下或向上,但你应该有反正。 有很可能是Django应用程序/库,做这个最适合你。

6. 为了安全起见,数据库需要支持事务。 如果字段是“自由形式”如文字等等,你需要允许可以编辑的字段(你不能有所有权的数据),你可以存储在变量中的原始数据。 当committs,检查输入数据从原始数据更改(如果不是,你不需要通过重写旧数据打扰DB) 如