Django之路: 基本命令与网址进阶
一、Django 基本命令 |
温馨提示:如果你想学习Django,那么就请您从现在开始按照笔记记录一步一步的用手把代码敲出来,千万不要偷懒哦。。。。。
1、创建一个Django project
django-admin.py startproject project
或者
django-admin startproject project
一个project为一个项目,后面project是项目名称,根据自己的需求可以自己自定义修改,必须要符合Python的变量命名规则(以下划线或字母开头)
2、新建app
django-admin.py startapp app
或python manage.py startapp app
第一种我自己测试了可以使用第二种,必须在当前文件夹下有一个manage.py文件才可以执行。后面的app是穿件app的名称
3、同步数据库
python manage.py syncdb
注意:Django 1.7.1及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate
这种方法可以创建表,当在models.py中新增类时,运行他就可以自动在数据库中创建表了,不用手动创建。
备注:对已有的models进行修改,Django 1.7之前的版本的Django都是无法自动更改表结构的,不过有第三方工具south,相见Django数据库迁移一章。
4、使用开发服务器
在开发服务器的时候使用,一般修改代码后会自动重启,方便调试和开发,但是由于性能问题,还是建议只是用来测试不要在生产环境中使用。
python manage.py runserver
# 当提示端口被占用的时候,可以用其它端口:
python manage.py runserver 8001
python manage.py runserver 9999
(当然也可以kill掉占用端口的进程)
# 监听所有可用 ip (电脑可能有一个或多个内网ip,一个或多个外网ip,即有多个ip地址)
python manage.py runserver 0.0.0.0:8000
# 如果是外网或者局域网电脑上可以用其它电脑查看开发服务器
# 访问对应的 ip加端口,比如 http://172.16.20.2:8000
5、清空数据库
python manage.py flush
此命令会询问是yes还是no,选择yes就会把数据全部清楚掉,只留下空表。
6、创建超级管理员
python manage.py createsuperuser
# 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
# 修改 用户密码可以用:
python manage.py changepassword username
7、导入导出数据
python manage.py dumpdata appname > appname.json #导出
python manage.py loaddata appname.json #导入
关于数据库操作 详见:数据导入数据迁移,现在了解有这个用法就可以了。
8、Django项目环境终端
python manage.py shell
如果安装了bpython或者ipython会自动用他们的界面,推荐是安装bpython。
这个命令和直接运行python或bpython进入shell的区别是:你可以在一个shell里面调用当前项目的models.py中的API,对于操作数据,还有一些小测试非常方便。
9、数据库命令行
python manage.py dbshell
Django会自动进入在settings.py中设置的数据库,如果是MySQL或者postgreSQL,会要求输入数据库用户名和密码。在这个终端可以进行数据库的SQL语句,如果您对SQL比较熟悉,可能更喜欢这种方式。
10、更多命令
终端上输入 python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用。
注:以上是基本的常用命令,建议在看下面的内容之前能够把上面的所有命令理解明白。
二、Django 视图与网址 |
一、先新建一个项目(project),名称为mysite
django-admin startproject mysite
或django-admin.py startproject mysite
注:如果是用Linux源码安装的,或者用pip安装的,也可以用django-admin.py
运行后,如果没有报错的话,可以看到以下目录,如果有错误请查看 Django之路:简介以及环境
root@w:~# tree mysite
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py 1 directory, 5 files
注:mysite目录中是一些项目的设置settings.py文件,总的urls配置文件urls.py以及部署服务器时用到的wsgi.py文件,__init__.py是python包的目录结构必须的,与调用有关。
在外层的mysite目录下
二、新建一个应用(app),名称叫learn
root@w:~/mysite# python manage.py startapp learn #learn是一个app的名称
在mysite目录下多了一个learn目录,其中learn下的文件是:
root@w:~/mysite# tree learn/
learn/
├── admin.py
├── __init__.py
├── models.py
├── tests.py
└── views.py 0 directories, 5 files
注:Django 1.8.x 以上的,还有一个 migrations 文件夹。Django 1.9.x 还会在 Django 1.8 的基础上多出一个 apps.py 文件。但是这些都与本文无关。
把新定义的app加到settings.py中的INSTALL_APPS中
修改 mysite/mysite/settings.py
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'learn', #把learn加到settings.py中
)
注:新键的app如果不加到INSTALL_APPS中的话,django就不能自动找到app中的模版文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件),后面会学到这些文件是用来做什么的。
二、定义视图函数(访问页面时的内容)
在learn目录中,把views.py打开,修改其中的源代码,改成下面的内容
root@w:~# sudo vi mysite/learn/views.py #目标文件
sudo: 无法解析主机:w #coding:utf-8 #编码声明为utf-8
from django.http import HttpResponse
def index(request):
return HttpResponse(u"欢迎访问吴老二的博客")
第一行是什么编码utf-8,因为在代码中用到了中文,如果不声明默认不会显示中文。
第二行引入HttpResponse,它是用来向网页返回内容的,就想python中的print一样,只是HttpResponse是把内容显示到网页上。
第三行定义了一个index()函数,第一个参数必须是request,与网页发来的请求有关,request变量是里面包含get或post的内容,用户浏览器,系统等信息在里面(后面会有详细介绍,这里先了解以下)。
函数返回了一个HttpResponse对象、可以经过一些处理,最终显示几个字到网页上。
那么页面的内容已经做好了,用什么url来访问呢?那么就请耐心的继续看下去。
三、定义视图函数相关的URL(网址)(访问什么网址可以返回定义的内容)
我们可以打开 mysite/mysite/urls.py 在这个文件里进行一些修改:
由于Django版本对urls.py进行了一些更改:
Django 1.7.x 及以下的版本看到的内容是这样的:
root@w:~# sudo vi mysite/mysite/urls.py from django.conf.urls import patterns, include, url from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
url(r'^$', 'learn.views.index'), #修改后的内容
# url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)),
)
Django 1.8.x及以上,Django官网鼓励(或要求)先引入,在使用:
root@w:~# sudo vi mysite/mysite/urls.py from django.conf.urls import patterns, include, url from django.contrib import admin
from learn import views as learn_views urlpatterns = patterns('',
url(r'^$', 'learn.views.index'),
url(r'^admin/', include(admin.site.urls)),
)
以上修改保存后,我们来看以下效果!
在终端上运行python manage.py runserver
root@w:~/mysite# python manage.py runserver
Validating models... 0 errors found
December 23, 2015 - 08:13:51
Django version 1.6.10, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[23/Dec/2015 08:14:31] "GET / HTTP/1.1" 200 30
注:是在mysite目录下运行的,如果没有出现以外的话在本机上访问http://127.0.0.1:8000就会出现下面的内容:
注意:如果你用的是虚拟机,想在另外一台电脑上访问的话要用python manage.py ip:port格式,比如监听所有IP:
我的虚拟机上的IP是192.168.1.30,以下在本地测试:
root@w:~/mysite# python manage.py runserver 192.168.1.30:8001
Validating models... 0 errors found
December 23, 2015 - 08:21:57
Django version 1.6.10, using settings 'mysite.settings'
Starting development server at http://192.168.1.30:8001/
Quit the server with CONTROL-C.
[23/Dec/2015 08:22:13] "GET / HTTP/1.1" 200 30
访问的页面是:
Django中的urls.py是用正则进行匹配的,如果不熟悉的可以学习以下正则表达式以及Python正则表达式。
三、Django 视图与网址进阶 |
一、在网页上做加减法
1、采用/add/?a=4&b=8 这样的GET方法进行
root@w:~# django-admin startproject zqxt_views
root@w:~# cd zqxt_views/
root@w:~/zqxt_views# python manage.py startapp calc
自动生成目录大致如下:
root@w:~# tree zqxt_views
zqxt_views
├── calc
│ ├── admin.py
│ ├── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── zqxt_views
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py 2 directories, 12 files
修改以下calc/views.py文件
root@w:~# sudo vi zqxt_views/calc/views.py from django.shortcuts import render
from django.http import HttpResponse
def add(request):
a = request.GET['a']
b = request.GET['b']
c = int(a)+int(b)
return HttpResponse(str(c))
注:request.GET类似于一个字典,更好的办法是用request.GET.get('a', 0)当没有传递a的时候默认是a为0
接着修改文件zqxt_views/urls.py ,添加一个网址来对应我们刚才新建的视图函数。
Django 1.7.x 及以下的同学可能看到的是这样的:
root@w:~# sudo vi zqxt_views/zqxt_views/urls.py from django.conf.urls import patterns, include, url from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
# Examples:
url(r'^add/$', 'calc.views.add', name='add'),
# url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)),
)
Django 1.8.x 及以上,Django官方鼓励(或要求)先引入,在使用,地版本的Django也可以这样使用:
root@w:~# sudo vi zqxt_views/zqxt_views/urls.py from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views
urlpatterns = [
url(r'^add/', calc_views.add, name='add'), # 注意修改了这一行
url(r'^admin/', admin.site.urls),
]
我们打开开发服务器并访问看看
root@w:~/zqxt_views# python manage.py runserver 192.168.1.30:8001
Validating models... 0 errors found
December 23, 2015 - 08:57:30
Django version 1.6.10, using settings 'zqxt_views.settings'
Starting development server at http://192.168.1.30:8001/
Quit the server with CONTROL-C.
[23/Dec/2015 08:57:39] "GET /add/ HTTP/1.1" 500 61882
浏览器打开
这个不能算是错误,因为我们没有传值进去,我们在后面加上?a=3&b=9,即http://192.168.1.30:8001/add/?a=3&b=9就可以看出网页上显示一个12,可以试着改变a和b的值,看看网页上的值是不是a和b的和
2、采用/add/3/9/这样的网址的方式
我们可以修改文件zqxt_views/calc/views.py,在定义一个函数,可以重新定义,也可以直接修改。这里直接修改。
root@w:~# sudo vi zqxt_views/calc/views.py from django.shortcuts import render
from django.http import HttpResponse
def add(request, a, b):
c = int(a)+int(b)
return HttpResponse(str(c))
接着修改zqxt_views/zqxt_views/urls.py文件中,修改url,如果你是添加的,可以直接修改也可以直接添加。Django 1.7.x 及以下:
root@w:~# sudo vi zqxt_views/zqxt_views/urls.py from django.conf.urls import patterns, include, url from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
# Examples:
url(r'^add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),
# url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)),
)
Django 1.8.x及以上:
root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
sudo: 无法解析主机:w from django.conf.urls import patterns, include, url from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
# Examples:
url(r'^add/(\d+)/(\d+)/$', 'calc_views.views.add', name='add'),
# url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)),
)
我们可以看到网址中多了(\d+),正则表达式中\d代表一个数字,+代表一个或多个前面的字符,写在一起\d+就是一个或多个数字,用括号括起来的意思是保存为一个子组,每一个子组将作为一个参数,被views.py中的对应视图函数接收。
我在差看以下http://192.168.1.30:8001/add/234/567/,看看是什么效果。
root@w:~/zqxt_views# python manage.py runserver 192.168.1.30:8001
Validating models... 0 errors found
December 23, 2015 - 09:17:00
Django version 1.6.10, using settings 'zqxt_views.settings'
Starting development server at http://192.168.1.30:8001/
Quit the server with CONTROL-C.
[23/Dec/2015 09:17:03] "GET /add/234/567/ HTTP/1.1" 200 3
浏览器访问:
二、url中的name【技能提升】
在看以下urls.py中的代码
root@w:~# sudo vi zqxt_views/zqxt_views/urls.py
sudo: 无法解析主机:w from django.conf.urls import patterns, include, url from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
# Examples:
url(r'^add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),
# url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)),
)
在开始的时候想用/add/3/6/,后来需求发生变化,又想改成/2__add__4/这样的格式,但是网页中已经有很多地方已经写死了,就是:
<a href="/add/3/6/">计算 3+6</a>
这样就会出现修改了urls.py后,对应的模版,还有视图用的跳转,以及models.py中也可以能有获取网址的地方。都要修改,这样的话工作量太大了,有时候忘记了也就不好找。
解决以上问题需要在终端上输入
root@w:~/zqxt_views# python manage.py shell
Python 2.7.10 (default, Oct 14 2015, 16:09:02)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.urlresolvers import reverse
>>> reverse('add', args=(3,6))
'/add/3/6/'
>>> reverse('add', args=(333,666))
'/add/333/666/'
reverse接收url中的name作为第一个参数,我们在代码中就可以通过reverse()来获取对应的网址(这个网址可以用来做跳转,也可以用来做计算相关的网址),只要对应的url的name不改,就不用改代码中的网址。
在网页的模版中也一样,可以很方便的使用。
不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}
例如:
<a href="{% url 'add2' 3 6 %}">link</a>
上面的代码渲染成最终的页面是
<a href="/add/3/6/">link</a>
这样就可以通过{% 'add' 3 6 %} 获取到对应的网址/add/3/6/
当urls.py进行更改,前提是不改name(这个参数设定好后不要轻易改),获取的网址也会动态地跟着变,比如改成:
url(r'^new_add/(\d+)/(\d+)/$', 'calc.views.add', name='add'),
注意看重点newadd变成了new_add,这时{% url 'add' 3 6 %}就会渲染对应的网址成/new_add/3/6/,reverse函数也一样会获取新的网址,这样改网址时只需要改urls.py中的正则表达式,其他的地方都“自动”跟着变了。
如何让以前的/add/3/6/自动跳转到新的网址上呢?要知道Django不会帮你做这个,方法如下:
在zqxt_views/calc/views.py 写一个跳转的函数
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
def old_add2_redirect(request, a, b):
return HttpResponseRedirect(
reverse('add2', args=(a, b))
)
在zqxt_views/zqxt_views/urls.py中:
url(r'^add2/(\d+)/(\d+)/$', calc_views.old_add2_redirect),
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
这里的add2就是/add/3/6的配置,这样在输入add/3/6/的时候会自动跳转到/new_add/3/6/了
开始的时候不觉得,用的久了,你会发现“死网址”的方法很糟糕。
Django之路: 基本命令与网址进阶的更多相关文章
- Python之路,Day8 - Socket编程进阶
Python之路,Day8 - Socket编程进阶 本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...
- Django之路
备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Django之路(一)——什么是Web开发 Django之路(二)——Django初识 Django之路(三)——U ...
- Django:学习笔记(7)——模型进阶
Django:学习笔记(7)——模型进阶 模型的继承 我们在面向对象的编程中,一个很重要的的版块,就是类的继承.父类保存了所有子类共有的内容,子类通过继承它来减少冗余代码并进行灵活扩展. 在Djang ...
- Django 视图与网址进阶
一 .在网页上做加减法 1. 采用 /add/?a=4&b=5 这样GET方法进行 1 2 3 django-admin.py startproject zqxt_views cd zqxt_ ...
- 【Django视图与网址进阶004】
一.在网页上做加减法 1. 采用 /add/?a=4&b=5 这样GET方法进行 django-admin.py startproject zqxt_views cd zqxt_views p ...
- Django之路: 模版篇
一.Django 模版 上章是介绍简单的把django.http.HttpResponse的内容显示到网页上,下面就介绍以下如何使用渲染模版的方法来显示内容.本节代码是基于Django 1.8,但 ...
- Django之路:QuerySet API,后台和表单
一.Django QuerySet API Django模型中我们学习了一些基本的创建和查询.这里专门讲以下数据库接口相关的接口(QuerySet API),当然你也可以选择暂时跳过这节.如果以后用到 ...
- Django之路:模型(数据库)和自定义Field以及数据表的更改
一.Django 模型(数据库) Django模型是与数据库相关的,与数据库相关的代码一般写在models.py中,Django支持sqlite3,MySQL,PostgreSQL等数据库,只需要在s ...
- Django之路:简介以及环境
(sudo) pip install Django 或者 (sudo) pip install Django==1.6.10 或者 pip install Django==1.7.6 Windows ...
随机推荐
- Slice到C++映射
按:本文是DPWI第6章的笔记. 客户端Slice到C++映射定义的是:怎样把Slice数据类型翻译成C++类型,客户怎样调用操作.传递参数.处理错误.C++映射线程安全,不存在内存管理问题.不建议查 ...
- diff and patch
A patch captures the changes of two different files (oldfile and newfile). Given the oldfile and the ...
- Hadoop YARN ERROR 1/1 local-dirs are bad *, 1/1 log-dirs are bad *
转 http://blog.csdn.net/u012303571/article/details/46913471 查看 nodemanager 日志发下 如下信息 2015-07-16 1 ...
- 还在纠结 Flux 或 Relay,或许 Redux 更适合你
重磅消息,Redux 1.0 发布,终于可以放心用于生产环境了! 在这个端应用技术膨胀的时代,每天都有一大堆框架冒出,号称解决了 XYZ 等一系列牛 X 的问题,然后过一段时间就不被提起了.但开发的应 ...
- Windows系统与Linux系统之间资源samba共享【转】
配置SAMBA服务器来实现在Windows计算机与Linux计算机之间的用户级的资源共享,九河网络TOM[2694339173]教你怎样操作: SAMBA服务器的基本配置 配置SAMBA服务器来实现在 ...
- js获取tr,td内容并排序
如题 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...
- PHP基本类型操作
//关键字对大小写不敏感echo ('hello world!<br>');ECho ('hello world<br>');eCho ('hello world<br& ...
- Java-Spring MVC如何返回一个非JSP文件名字的地址
return new ModelAndView("redirect:/bizitem/goEditItem.do?item_id="+item_id+"&msg= ...
- oracle提高之索引学习
一. 索引介绍 1.1 索引的创建 语法 : CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema ...
- 超棒的自定义超酷滚动条jQuery插件 - Perfect Scrollbar
可能大家厌倦了千篇一律的页面滚动条,如果你希望能够设计出与众不同的页面UI设计的话,Perfect ScrollBar可能就是你寻找的解决方案. 这个滚动条来自于一个个人项目,一个简单但是非常棒的滚动 ...