django学习记录之创建应用,视图,路由

1.在创建好虚拟环境之后,使用:

django-admin  startproject my_project

会自动的生成一个工程目录如下:

settings.py 是项目的整体配置文件。

urls.py 是项目的URL配置文件。

wsgi.py 是项目与WSGI兼容的Web服务器入口。

manage.py 是项目管理文件,通过它管理项目。

可以直接使用:python manage.py  runserver  【ip:port】来执行。

2.创建子应用:一个功能模块一个子应用。

创建:在doc窗口输入:前提先进入到manage.py文件所在的目录,然后执行下面命令

python manage.py startproject users(子应用名称)

miggrations:数据库迁移历史文件。

admin.py:文件跟网站的后台管理站点配置相关。

apps.py:保存子应用的配置信息

models.py:保存数据库模型类

tests.py:用于开发测试用例,编写单元测试

views:编写视图函数

urls.py:手动添加的,用于url路由

注意:在创建完子应用之后,需要注册安装才能使用。在工程配置文件setting.py中,INSTALL_APPS中注册路径

3.APP应用的配置

每个应用中都包含了apps.py文件,在创建时会默认写入一个配置类,APPConfig.name属性表示这个配置类(Userconfig)是加载Users这个应用的。APPConfig.verbose_name给它一个直观的名字在Admin.py管理站点中显示。

4.创建视图:和flask一样都是在views.py中创建。

5.定义路由

1.为了保证每个子应用的相对独立,可以在每个子应用中新建一个urls.py文件用于保存该子应用的路由,在users/urls.py中定义路由信息。然后在主路由文件my_django.py中包含各子应用的子路由数据。

2.添加完成之后还需要在总工程my_django/urls中添加子应用的路由

再次启动程序:python manage.py runserver

然后访问:127.0.0.1:8000/users/index

7。路由定义位置:除了在子应用中新建urls.py文件,定义子应用的路由之外,还可以在总路由中直接定义,不需要子应用的urls.py文件

8.路由解析顺序:需要注意定义路由的顺序,避免出现屏蔽效应。

从主路由文件中的urlpatterns列表中以由上至下的顺序查找对应路由规则,如果发现规则为include包含,则再进入被包含的urls中的urlpatterns列表由上至下进行查询。

值得关注的由上至下的顺序,有可能会使上面的路由屏蔽掉下面的路由,带来非预期结果。如:

urlpatterns = [ 
   url(r'^say', views.say),
   url(r'^sayhello', views.sayhello),
]

即使访问sayhello/路径,预期应该进入sayhello视图执行,但实际优先查找到了say路由规则也与sayhello/路径匹配,实际进入了say视图执行。

路由命名

在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。

1) 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如

url(r'^users/', include('users.urls', namespace='users')),

命名空间表示,凡是users.urls中定义的路由,均属于namespace指明的users名下。

命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。

2) 在定义普通路由时,可以使用name参数指明路由的名字,如

urlpatterns = [
    url(r'^index/$', views.index, name='index'),
    url(r'^say', views.say, name='say'),
]

3.2 reverse反解析

使用reverse函数,可以根据路由名称,返回具体的路径,如:

from django.core.urlresolvers import reverse  # 注意导包路径

def index(request):
    return HttpResponse("hello the world!")

def say(request):
    url = reverse('users:index')  # 返回 /users/index/
    print(url)
    return HttpResponse('say')
  • 对于未指明namespace的,reverse(路由name)
  • 对于指明namespace的,reverse(命名空间namespace:路由name)

猜你喜欢

转载自blog.csdn.net/qq_35867759/article/details/83537589
今日推荐