web框架:Django


#--------------------------------------------------------------------------------------------------
Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!
一:
urls.py
网址入口,关联到对应的views.py中的一个函数(或者generic类),访问网址就对应一个函数。

views.py
处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的网页可以将显示内容,比如登陆后的用户名,用户请求的数据,输出到网页。

models.py
与数据库操作相关,存入或读取数据时用到这个,当然用不到数据库的时候 你可以不使用。

forms.py
表单,用户在浏览器上输入数据提交,对数据的验证工作以及输入框的生成等工作,当然你也可以不使用。

templates 文件夹

views.py 中的函数渲染templates中的Html模板,得到动态内容的网页,当然可以用缓存来提高速度。

admin.py
后台,可以用很少量的代码就拥有一个强大的后台。

settings.py
Django 的设置,配置文件,比如 DEBUG 的开关,静态文件的位置等。


二:Django 基本命令

1. 新建一个 django project
1
2
django-admin startproject project_name
特别是在 windows 上,如果报错,尝试用 django-admin 代替 django-admin.py 试试
注意 project_name 是自己的项目名称,需要为合法的 Python 包名,如不能为 1a 或 a-b。

2. 新建 app
要先进入项目目录下,cd project_name 然后执行下面的命令(下同,已经在项目目录下则不需要 cd project_name)

1
2
python manage.py startapp app_name
或 django-admin.py startapp app_name
一般一个项目有多个app, 当然通用的app也可以在多个项目中使用。

与项目名类似 app name 也需要为合法的 Python 包名,如 blog,news, aboutus 等都是合法的 app 名称。

3. 创建数据库表 或 更改数据库表或字段
1
2
3
4
5
6
7
8
9
Django 1.7.1及以上 用以下命令
# 1. 创建更改的文件
python manage.py makemigrations
# 2. 将生成的py文件应用到数据库
python manage.py migrate
旧版本的Django 1.6及以下用
python manage.py syncdb
这种方法可以在SQL等数据库中创建与models.py代码对应的表,不需要自己手动执行SQL。

备注:对已有的 models 进行修改,Django 1.7之前的版本的Django都是无法自动更改表结构的,不过有第三方工具 south,详见 Django 数据库迁移 一节。

4. 使用开发服务器
开发服务器,即开发时使用,一般修改代码后会自动重启,方便调试和开发,但是由于性能问题,建议只用来测试,不要用在生产环境。

1
2
3
4
5
6
7
8
9
10
11
python manage.py runserver
# 当提示端口被占用的时候,可以用其它端口:
python manage.py runserver 8001
python manage.py runserver 9999
(当然也可以kill掉占用端口的进程,具体后面有讲,此处想知道的同学可查下 lsof 命令用法)
# 监听机器所有可用 ip (电脑可能有多个内网ip或多个外网ip)
python manage.py runserver 0.0.0.0:8000
# 如果是外网或者局域网电脑上可以用其它电脑查看开发服务器
# 访问对应的 ip加端口,比如 http://172.16.20.2:8000
5. 清空数据库
1
python manage.py flush
此命令会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表。

6. 创建超级管理员
1
2
3
4
5
6
python manage.py createsuperuser
# 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
# 修改 用户密码可以用:
python manage.py changepassword username
7. 导出数据 导入数据
1
2
python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json
关于数据操作 详见:数据导入数据迁移,现在了解有这个用法就可以了。

8. Django 项目环境终端
1
python manage.py shell
如果你安装了 bpython 或 ipython 会自动用它们的界面,推荐安装 bpython。

这个命令和 直接运行 python 或 bpython 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据,还有一些小测试非常方便。

9. 数据库命令行
1
python manage.py dbshell
Django 会自动进入在settings.py中设置的数据库,如果是 MySQL 或 postgreSQL,会要求输入数据库用户密码。

在这个终端可以执行数据库的SQL语句。如果您对SQL比较熟悉,可能喜欢这种方式。

10. 更多命令
1
终端上输入 python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用。

三:

简单总结一下:一般的变量之类的用 {{ }}(变量),功能类的,比如循环,条件判断是用 {% %}(标签)

在for循环中还有很多有用的东西,如下:

变量 描述
forloop.counter 索引从 1 开始算
forloop.counter0 索引从 0 开始算
forloop.revcounter 索引从最大长度到 1
forloop.revcounter0 索引从最大长度到 0
forloop.first 当遍历的元素为第一项时为真
forloop.last 当遍历的元素为最后一项时为真
forloop.parentloop
用在嵌套的 for 循环中,

获取上一层 for 循环的 forloop




























#---------------------------------------------------------

django中至少需要包含一个以上的应用/app
创建项目:django-admin startproject xiaoshuo
创建应用:python manage.py startapp novel
需求文档:
开发文档:







新建Django项目,我这里是使用命令创建项目的。

django-admin startproject HelloDjango 创建HelloDjango项目

然后进入到HelloDjango项目根目录下,运行命令创建hello模块

python manage.py startapp hello

此时PyCharm中就有一个HelloDjango项目了。

现在我们来搭建一个简单的web服务。

修改views.py文件

修改urls.py文件

两个文件修改完后,就可以启动项目了,执行命令

python manage.py migrate

python manage.py runserver




#-----------------------------------------------------------------------------------------------
Django 注释使用 {# #}。
HttpRequest对象包含当前请求URL的一些信息:
属性
描述
path
请求页面的全路径,不包括域名—例如, "/hello/"。
method
请求中使用的HTTP方法的字符串表示。全大写表示。例如:
if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()
GET
包含所有HTTP GET参数的类字典对象。参见QueryDict 文档。
POST
包含所有HTTP POST参数的类字典对象。参见QueryDict 文档。
服务器收到空的POST请求的情况也是有可能发生的。也就是说,表单form通过HTTP POST方法提交请求,但是表单中可以没有数据。因此,不能使用语句if request.POST来判断是否使用HTTP POST方法;应该使用if request.method == "POST" (参见本表的method属性)。
注意: POST不包括file-upload信息。参见FILES属性。
REQUEST
为了方便,该属性是POST和GET属性的集合体,但是有特殊性,先查找POST属性,然后再查找GET属性。借鉴PHP's $_REQUEST。
例如,如果GET = {"name": "john"} 和POST = {"age": '34'},则 REQUEST["name"] 的值是"john", REQUEST["age"]的值是"34".
强烈建议使用GET and POST,因为这两个属性更加显式化,写出的代码也更易理解。
COOKIES
包含所有cookies的标准Python字典对象。Keys和values都是字符串。
FILES
包含所有上传文件的类字典对象。FILES中的每个Key都是<input type="file" name="" />标签中name属性的值. FILES中的每个value 同时也是一个标准Python字典对象,包含下面三个Keys:
filename: 上传文件名,用Python字符串表示
content-type: 上传文件的Content type
content: 上传文件的原始内容
注意:只有在请求方法是POST,并且请求页面中<form>有enctype="multipart/form-data"属性时FILES才拥有数据。否则,FILES 是一个空字典。
META
包含所有可用HTTP头部信息的字典。 例如:
CONTENT_LENGTH
CONTENT_TYPE
QUERY_STRING: 未解析的原始查询字符串
REMOTE_ADDR: 客户端IP地址
REMOTE_HOST: 客户端主机名
SERVER_NAME: 服务器主机名
SERVER_PORT: 服务器端口
META 中这些头加上前缀HTTP_最为Key, 例如:
HTTP_ACCEPT_ENCODING
HTTP_ACCEPT_LANGUAGE
HTTP_HOST: 客户发送的HTTP主机头信息
HTTP_REFERER: referring页
HTTP_USER_AGENT: 客户端的user-agent字符串
HTTP_X_BENDER: X-Bender头信息
user
是一个django.contrib.auth.models.User 对象,代表当前登录的用户。
如果访问用户当前没有登录,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。
你可以通过user的is_authenticated()方法来辨别用户是否登录:
if request.user.is_authenticated():
# Do something for logged-in users.
else:
# Do something for anonymous users.
只有激活Django中的AuthenticationMiddleware时该属性才可用
session
唯一可读写的属性,代表当前会话的字典对象。只有激活Django中的session支持时该属性才可用。
raw_post_data
原始HTTP POST数据,未解析过。 高级处理时会有用处。
Request对象也有一些有用的方法:
方法
描述
__getitem__(key)
返回GET/POST的键值,先取POST,后取GET。如果键不存在抛出 KeyError。 
这是我们可以使用字典语法访问HttpRequest对象。 
例如,request["foo"]等同于先request.POST["foo"] 然后 request.GET["foo"]的操作。
has_key()
检查request.GET or request.POST中是否包含参数指定的Key。
get_full_path()
返回包含查询字符串的请求路径。例如, "/music/bands/the_beatles/?print=true"
is_secure()
如果请求是安全的,返回True,就是说,发出的是HTTPS请求。
QueryDict对象
在HttpRequest对象中, GET和POST属性是django.http.QueryDict类的实例。
QueryDict类似字典的自定义类,用来处理单键对应多值的情况。
QueryDict实现所有标准的词典方法。还包括一些特有的方法:
方法
描述
__getitem__
和标准字典的处理有一点不同,就是,如果Key对应多个Value,__getitem__()返回最后一个value。
__setitem__
设置参数指定key的value列表(一个Python list)。注意:它只能在一个mutable QueryDict 对象上被调用(就是通过copy()产生的一个QueryDict对象的拷贝).
get()
如果key对应多个value,get()返回最后一个value。
update()
参数可以是QueryDict,也可以是标准字典。和标准字典的update方法不同,该方法添加字典 items,而不是替换它们:
>>> q = QueryDict('a=1')

>>> q = q.copy() # to make it mutable

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

>>> q.getlist('a')

['1', '2']

>>> q['a'] # returns the last

['2']
items()
和标准字典的items()方法有一点不同,该方法使用单值逻辑的__getitem__():
>>> q = QueryDict('a=1&a=2&a=3')

>>> q.items()

[('a', '3')]
values()
和标准字典的values()方法有一点不同,该方法使用单值逻辑的__getitem__():
此外, QueryDict也有一些方法,如下表:
方法
描述
copy()
返回对象的拷贝,内部实现是用Python标准库的copy.deepcopy()。该拷贝是mutable(可更改的) — 就是说,可以更改该拷贝的值。
getlist(key)
返回和参数key对应的所有值,作为一个Python list返回。如果key不存在,则返回空list。 It's guaranteed to return a list of some sort..
setlist(key,list_)
设置key的值为list_ (unlike __setitem__()).
appendlist(key,item)
添加item到和key关联的内部list.
setlistdefault(key,list)
和setdefault有一点不同,它接受list而不是单个value作为参数。
lists()
和items()有一点不同, 它会返回key的所有值,作为一个list, 例如:
>>> q = QueryDict('a=1&a=2&a=3')

>>> q.lists()

[('a', ['1', '2', '3'])]
urlencode()
返回一个以查询字符串格式进行格式化后的字符串(e.g., "a=2&b=3&b=5").

#---------------------------------------------------------------------------------------------------------
四. 搭建多个互不干扰的开发环境(可选)
我们有的时候会发现,一个电脑上有多个项目,一个依赖 Django 1.8,另一个比较旧的项目又要用 Django 1.5,这时候怎么办呢?
我们需要一个依赖包管理的工具来处理不同的环境。
如果不想搭建这个环境,只想用某一个版本的 Django 也可以,但是推荐学习此内容!
4.1 虚拟环境依赖安装
开发会用 virtualenv 来管理多个开发环境
Linux/MacOS 下
virtualenvwrapper 使得virtualenv变得更好用,所以我们一起安装了
1
2
# 安装:
(sudo) pip install virtualenv virtualenvwrapper
修改~/.bash_profile或其它环境变量相关文件(如 .bashrc 或用 ZSH 之后的 .zshrc),添加以下语句
1
2
3
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/bin/virtualenvwrapper.sh
修改后使之立即生效(也可以重启终端使之生效):
1
source ~/.bash_profile

Windows 下:
1
pip install virtualenv virtualenvwrapper-win
【可选】Windows下默认虚拟环境是放在用户名下面的Envs中的,与桌面,我的文档,下载等文件夹在一块的。更改方法:计算机,属性,高级系统设置,环境变量,添加WORKON_HOME,如图(windows 10 环境变量设置截图):
workon_home.png
4.2 虚拟环境使用方法:
mkvirtualenv zqxt:创建运行环境zqxt
workon zqxt: 工作在 zqxt 环境 或 从其它环境切换到 zqxt 环境
deactivate: 退出终端环境

其它的:
rmvirtualenv ENV:删除运行环境ENV
mkproject mic:创建mic项目和运行环境mic
mktmpenv:创建临时运行环境
lsvirtualenv: 列出可用的运行环境
lssitepackages: 列出当前环境安装了的包
创建的环境是独立的,互不干扰,无需sudo权限即可使用 pip 来进行包的管理







#--------------------------------------------------------------------
错误:
1.attempted relative import beyond top-level packag

from ..fast_rcnn.nms_wrapper import nms
解决方法:
把两点去掉
from fast_rcnn.nms_wrapper import nms

2.








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值