django web project的项目结构:
根目录mysite/ 相当于整个django web project的根。
manage.py 就是管理当前web project的配置文件
第二个mysite/目录相当于是当前web project的一个web app(也就是整个web工程的一个功能模块)
每个web app下面需要有图中给定的一些配置文件: 包括 init.py urls.py (剩下的 settings.py 和 wsgi.py 暂时不清楚是否每个web app目录中都要有,或许是只有根 web app 目录才需要有 这里以后要补充)
在一个web project下面创建新的web app使用命令
python manage.py startapp [appname]
比如在mysite下面运行: python manage.py startapp polls 以后整个文件结构是:
在web app下面增加新的页面
比如:
(1)首先你需要在 polls/views.py 下面添加函数,这个函数对应着显示一个url请求的页面(有可能还负责处理当前url对应页面的逻辑? 暂时还没搞明白)
(python的web开发框架好像都是按照一个函数一个页面的原理进行的)
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
(2)然后,你就需要在polls/urls.py内映射本地web app的view 和 url的对应关系(没有urls.py则需要创建一个)
from django.conf.urls import url
from . import views
#r在字符串前面代表不要转义/,比如 r'^polls/test', 此时 /t 就不转义为制表符
#^貌似代表相对路径。比如在根urls.py下(如这里的mysite/mysite/urls.py)
# 如果是r'^polls/'则直接代表127.0.0.1:8080/polls/
#$代表路径的结束符,文档中好像说有了 '/' 则不再需要声明 '$'
urlpatterns = [
url(r'^$', views.index, name='index'),
]
(3)最后需要把 其他web app下的urls.py配置的url映射到根web app下的urls.py中,这里我们默认mysite/urls.py是根urls.py 。
(设置根urls.py好像是在settings.py中,具体设置这个有什么规范和限制暂时还不知道)
from django.conf.urls import include, url
from django.contrib import admin
#在一个urls.py中包含其他urls.py需要使用 django.conf.urls.include 函数指定被包含的urls.py的相对地址
urlpatterns = [
url(r'^polls/', include('polls.urls')),
url(r'^admin/', admin.site.urls),
]
最后就可以通过访问 127.0.0.1:8080/polls 或者 127.0.0.1:8080/admin 请求到对应页面。
启动django web service
启动django web service 的命令是:
(进入web project目录后,运行)
python manage.py runserver [server ip address:port]
django url的配置问题
Note that these regular expressions do not search GET and POST parameters, or the domain name. For example, in a request to https://www.example.com/myapp/, the URLconf will look for myapp/.
In a request to https://www.example.com/myapp/?page=3, the URLconf will also look for myapp/.
managy.py通过设置settings.py来和已导入web apps互动
python manage.py shell
managy.py内设置DJANGO_SETTINGS_MODULE的路径:
在settings.py中,使用INSTALLED_APPS添加可用的web apps。 django自带的通用app都在django.contrib下。 自定义的web app需要自己指定路径
设置完这些之后,就可以通过调用manage.py访问到apps的各种资源(models, views, urls?)
django查找数据库,创建数据库表,修改数据库
都是通过调用web apps 下面的 models.py中的函数完成的(models.py中一个类被看做数据库中的一张table,类里面定义了很多fields就是该表所拥有的所有属性,类需要继承django.db.models.Model类,这样才可以在web app的其他地方,比如view 里面调用models.py里面的类从models.Model集成的方法去操作相应的数据库表,比如objects方法。)
比如:
类Question在数据库中定义了一张名为Question的表,里面含有属性 question_text, pub_date。
我们可以调用Question.objects.[各种方法] 去访问,操作Qustion表。
比如:
当objects.get()查找不到表中的记录时,会抛出DoesNotExist异常,这个异常是被定义在相应表的class下面的。
比如Qustion.objects.get(id=2)抛出DoesNotExist异常时,这个异常就是Question.DoesNotExist
我们相应的就应该这样处理异常:
django操作models.py的类,往数据库中添加记录
django实例化models.py中的类,就是往相应的数据库表中添加记录
比如:
#实例化一个Question
q = Question(question_text="What's new?", pub_date=timezone.now())
q.save() #使用从django.db.models.Model继承得来的save()方法,把实例对象当作一条记录存进相应的数据库表中
django路径匹配的过程
1.(先找ROOT_URLCONF定义的urls.py去匹配其中的urlpatterns)
2.如果找不到,则报错;如果找到了,则把余下的url参数去匹配找到的那个web app的 urls.py中的urlpatterns。
3.直到匹配到$为正常结束,或者没匹配到$则算作没匹配到。
When somebody requests a page from your website – say, “/polls/34/”, Django will load the mysite.urls
Python module because it’s pointed to by the ROOT_URLCONF
setting. It finds the variable named urlpatterns and traverses the regular expressions in order. After finding the match at '^polls/', it strips off the matching text ("polls/") and sends the remaining text – "34/" – to the ‘polls.urls’ URLconf for further processing. There it matches r'^(P<ques
tion_id>[0-9]+)/$', resulting in a call to the detail()。
两种渲染django默认templates的方法
方法一:使用django.template.loader加载template实例,然后调用template实例的render方法,通过HttpResponse返回客户端
方法二:直接调用django.shortcuts.render方法并返回给客户端
定义通用的错误处理页面
(1)先建立一个web app用来存放所有出错页面,比如404,403,500等
python manage.py startapp errorpages
(2)在errorpages目录下面创建templates文件夹,用于存放前端模板(这里我还不会整合bootstrap,所以暂时使用html就好)
官方推荐的方式建立 errorpages的templates目录结构为:
mysite
- errorpages
- templates
- errorpages
- 404.html
- 500.html
- ...
(3)在mysite web project的根web app下面的settings.py中的INSTALLS_APPS,添加errorpages的路径。django只会查找INSTALLED_APPS中的所有web apps目录下面的templates。因此,为了能够在errorpages中使用到templates,需要完成本步骤。
(4)在errorpages的views.py中添加对应错误页面的view类:
注意这里的模板的路径,只要从mysite/errorpages/templates的子目录开始写就行,因为我们已经在mysite/mysite/settings.py中定义了errorpages是一个INSTALLS_APPS成员,所以,在errorpages/views.py中调用render_to_response去加载templates时,django就会自动搜索到mysite/errorpages/templates目录,然后再根据render函数调用时传入的参数如:'errorpages/400.html'去查找上面那个目录是否有400.html这个文件。
(5)最后需要在mysite/mysite/urls.py 也就是根urls.py文件中映射错误代码和通用的错误页view。
以上,就是定义通用错误处理页面的方法。具体,遇到各种错误后,的一些处理逻辑,可以根据需要添加在errorpages/views.py的对应class中。