Django基础概念
发表于:2024-11-29 作者:热门IT资讯网编辑
编辑最后更新 2024年11月29日,Django遵循MVC设计模式的框架,MVC是Model、View、Controller的三个单词的简写。分别代表模型、视图、控制器。创建项目通过命令行方式,首先进入到安装了Django的虚拟环境中通
Django
遵循MVC设计模式的框架,MVC是Model、View、Controller的三个单词的简写。分别代表模型、视图、控制器。
创建项目
- 通过命令行方式,首先进入到安装了Django的虚拟环境中
- 通过pycharm方式
# 创建项目1、命令行:django-admin startproject [项目名称]2、pycharm方式:文件->创建项目->选择django。然后指定项目所在的路径,以及python解释器。#运行项目python manage.py runserver可添加端口 python manage.py runserver 8088对公访问 python manage.py runserver 0.0.0.0 8088
项目结构介绍
- manage.py:和项目交互都基于这个文件,python manage.py [子命令]
- settings.py:本项目的设置项,所有和项目相关的配置都是放在这个里面
- urls.py:用来配置URL路由的,比如访问http://127.0.0.1/news/ 是访问新闻列表页,这些东西就需要在这个文件中完成。
- wsgi.py:项目与WSGI协议兼容的web服务器入口,部署的时候需要用到的,一般情况下也是不需要修改的。
创建app
python manage.py startapp django_1
视图函数
- 视图函数的第一个参数必须是request,这个参数不能少
- 视图函数的返回值必须是
django.http.response.HttpResponseBase
的子类的对象。
URL传递参数
- url映射
- 要去urls.py文件中寻找映射是因为在settings.py文件中配置了
ROOT_URLCONF
为urls.py
。所有的django会去urls.py中寻找。 - 在
urls.py
中我们所有的映射都应该放在urlpatterns
这个变量中。 - 所有的映射不是随便写的,而是使用
path
函数或者是re_path
函数进行包装的。
- 要去urls.py文件中寻找映射是因为在settings.py文件中配置了
- url传参数
- 采用在url中使用变量的方式:在path的第一个参数中,使用
<参数名>
的方式传递参数,然后在视图函数中也要写一个参数。视图函数中的参数必须和url中的参数名称保持一致,不然找不到这个参数。 - 采用查询字符串的方式:在url中不需要单独的匹配查询字符串的部分,只需要在视图函数中使用
request.GET.get('参数名称')
的方式来获取。代码如下:def author_detail(request):author_id = request.GET['id']text = '作者的id是:%s' % author_idreturn HttpResponse(text)
因为查询字符串使用的是
GET
请求,所以我们通过request.GET
来获取参数,并且因为GET
是一个类似于字典的数据类型,所有获取值跟字典的方式都是一样的。
- 采用在url中使用变量的方式:在path的第一个参数中,使用
url命名
- 需要url命名的原因
因为url是经常变化的,写死可能会经常修改代码。给url取个名字以后使用url的时候就使用它的名字进行反转就可以了。 如何给一个url指定名称
在path函数中,传递一个name
参数就可以指定。# urls.pyfrom django.urls import pathfrom . import viewsurlpatterns = [ path('',views.index,name='index'), path('signin/',views.login,name='login')]# views.pyfrom django.http import HttpResponsefrom django.shortcuts import redirect,reversedef index(request): username = request.GET.get('username') if username: return HttpResponse('首页') else: return redirect(reverse('login'))
应用命名空间
在多个app之间,有可能产生同名的url。这时为了避免反转url的时候产生混淆,可以使用应用命名空间来做区分。定义应用命名空间非常简单,只要在app的urls.py中定义一个叫做app_name的变量来指定这个应用的命名空间即可。# urls.pyfrom django.urls import pathfrom . import viewsapp_name = 'front'urlpatterns = [ path('',views.index,name='index'), path('signin/',views.login,name='login')]# views.pyfrom django.http import HttpResponsefrom django.shortcuts import redirect,reversedef index(request): username = request.GET.get('username') if username: return HttpResponse('首页') else: return redirect(reverse('front:login'))
- 应用命名空间和实例名空间
# 一个app可以创建多个实例,可以使用多个url映射同一个app。在做反转的时候使用应用命名空间,那么就会发生混淆,为了避免这个问题就可以使用实例命名空间。在include函数中传递一个namespace变量即可。# urls.py from django.urls import path,includeurlpattterns = [path('',include('front.urls')),path('cms1/',include('cms.urls',namespace='cms1')),path('cms2/',include('cms.urls',namespace='cms2'))]
url分层模块化
多个app后主app的urls.py里的urlpatterns会写入过多路径,可通过在app里创建自身app对应的urls.py来方便路径转发。
# 主urls.py,使用include函数包含子urls.pyfrom django.urls import path,includeurlpattterns = [ path('book/',include('book.urls')) # 以book开头的url都会转到book app下的urls.py]# book app的 urls.pyfrom django.urls import pathfrom . import viewsurlpattterns = [ path('',views.book), path('detail/',views.book_detail), path('list/',views.book_list),]
reverse函数补充
1、如果反转url的时候,需要添加参数,那么可以传递kwargs参数到reverse函数中。
2、如果想要添加查询字符串的参数,则必须手动的
进行拼接。
# views.pyfrom django.http import HttpResponsefrom django.shortcuts import reverse,redirectdef index(request): username = request.GET.get('username') if username: return HttpResponse("首页") else: # login_url = reverse('login') + "?next=/" # return redirect(login_url) detail_url = reverse('detail',kwargs={'article_id':1,'page':2}) return redirect(detail_url)def login(request): return HttpResponse("登录页面")def article_detail(request,article_id): text = '您的文章id是:%s' % article_id return HttpResponse(text)# urls.pyfrom django.urls import pathfrom front import viewsurlpatterns = [ path('',views.index,name='index'), path('login/',views.login,name='login'), path('detail///',views.article_detail,name='detail')]