Django基础概念
admin
2023-07-09 22:24:49
0
Django

遵循MVC设计模式的框架,MVC是Model、View、Controller的三个单词的简写。分别代表模型、视图、控制器。
Django基础概念

创建项目
  • 通过命令行方式,首先进入到安装了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_URLCONFurls.py。所有的django会去urls.py中寻找。
    • urls.py中我们所有的映射都应该放在urlpatterns这个变量中。
    • 所有的映射不是随便写的,而是使用path函数或者是re_path函数进行包装的。
  • url传参数
    • 采用在url中使用变量的方式:在path的第一个参数中,使用<参数名>的方式传递参数,然后在视图函数中也要写一个参数。视图函数中的参数必须和url中的参数名称保持一致,不然找不到这个参数。
    • 采用查询字符串的方式:在url中不需要单独的匹配查询字符串的部分,只需要在视图函数中使用request.GET.get('参数名称')的方式来获取。代码如下:
      def author_detail(request):
      author_id = request.GET['id']
      text = '作者的id是:%s' % author_id
      return HttpResponse(text)

      因为查询字符串使用的是GET请求,所以我们通过request.GET来获取参数,并且因为GET是一个类似于字典的数据类型,所有获取值跟字典的方式都是一样的。

url命名
  • 需要url命名的原因
    因为url是经常变化的,写死可能会经常修改代码。给url取个名字以后使用url的时候就使用它的名字进行反转就可以了。
  • 如何给一个url指定名称
    在path函数中,传递一个name参数就可以指定。

    # urls.py
    from django.urls import path
    from . import views
    urlpatterns = [
        path('',views.index,name='index'),
        path('signin/',views.login,name='login')
    ]
    
    # views.py
    from django.http import HttpResponse
    from django.shortcuts import redirect,reverse
    
    def 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.py
    from django.urls import path
    from . import views
    app_name = 'front'
    
    urlpatterns = [
        path('',views.index,name='index'),
        path('signin/',views.login,name='login')
    ]
    
    # views.py
    from django.http import HttpResponse
    from django.shortcuts import redirect,reverse
    
    def 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,include
    urlpattterns = [
    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.py
from django.urls import path,include

urlpattterns = [
    path('book/',include('book.urls'))
    # 以book开头的url都会转到book app下的urls.py
]

# book app的 urls.py
from django.urls import path
from . import views

urlpattterns = [
    path('',views.book),
    path('detail/',views.book_detail),
    path('list/',views.book_list),
]
reverse函数补充

1、如果反转url的时候,需要添加参数,那么可以传递kwargs参数到reverse函数中。
2、如果想要添加查询字符串的参数,则必须手动的
进行拼接。

# views.py
from django.http import HttpResponse
from django.shortcuts import reverse,redirect

def 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.py
from django.urls import path
from front import views

urlpatterns = [
    path('',views.index,name='index'),
    path('login/',views.login,name='login'),
    path('detail///',views.article_detail,name='detail')
]

相关内容

热门资讯

美伊谈判濒临破裂之际,伊朗议长... 因为以色列持续对黎巴嫩进行军事打击,伊朗宣布暂停同美国的谈判。不过美国总统特朗普称,对话仍在继续。谈...
罕见!以军政策发生“重大转变” 新华社北京6月1日电 题:罕见纵深推进,以军对黎行动会否搅动美伊谈判新华社记者刘品然 阚静文 席玥以...
山西太原发现一处新石器遗址,出... 山西省太原市文物保护研究院协同相关科研机构,近期在太原市阳曲县西盘威村发现一处新石器时代重要遗址——...
伊媒发布穆杰塔巴罕见照片 伊朗塔斯尼姆通讯社6月1日发布了一张最高领袖穆杰塔巴的照片。照片中,穆杰塔巴面露笑容,抱着一个婴儿。...
福建“泡药杨梅”曝光后,浙江杨... 这两天,浙江本地杨梅少量进入市场。虽然受到此前福建 “泡药杨梅” 事件影响,市场整体销量相比去年同期...
尺素金声 | 前4月规上工业企... 5月27日,国家统计局发布最新数据显示,今年前4月,全国规上工业企业实现利润同比增长18.2%,增速...
郑丽文:台湾民众越来越了解“台... 针对台湾《联合报》民调显示,63%受访者民意希望维持现状,即将访美的中国国民党主席郑丽文1日表示,民...
美前副总统:共和党失去了方向,... 2026年是美国的中期选举年,共和党选情不利,可能在年底的选举中遭遇挫败。美国前副总统彭斯5月31日...
南枝原来去过中国?《给阿嬷的情... 《给阿嬷的情书》票房口碑双丰收,目前票房已突破13亿。凤凰卫视最新一期《问答神州》专访了该片导演蓝鸿...
法国海军扣押一艘俄“影子舰队”... 近日,法国海军在大西洋海域扣押了一艘据称从俄罗斯摩尔曼斯克出发的油轮,引发俄方强烈不满。俄新社6月1...