当前位置:   article > 正文

Django从入门到精通(一)

django

目录

一、Django环境搭建与命令

1.1、安装

1.2、命令行

创建项目

编写代码

运行

app概念

1.3、Pycharm创建项目

1.4、虚拟环境

创建虚拟环境 - 命令行

介绍

操作

基本问题

Pycharm

项目+虚拟环境

django+虚拟环境【安装django最新版本】

django+虚拟环境【安装指定版本django】

1.5、关于创建app

二、路由

2.1、传统的路由

传参的几种方式

(1)restful风格

(2)问号传参

2.2、正则表达式路由

2.3、路由分发

include分发

手动分发

2.4、name属性

2.5、namespace

2.6、namespace扩展

namespace需要设置app_name

手动分发

2.7、最后的 / 如何解决?

2.8、当前匹配对象


一、Django环境搭建与命令

1.1、安装

pip install django==3.2
  1. C:\Python39
  2. - python.exe
  3. - Scripts
  4. - pip.exe
  5. - django-admin.exe
  6. - Lib
  7. - re.py
  8. - random.py
  9. - site-pakages
  10. - django==3.2
  11. ...

1.2、命令行

创建项目

  1. cd 指定目录
  2. django-admin startproject 项目名

  1. django_demo01
  2. ├── manage.py [项目的管理工具]
  3. └── django_demo01
  4. ├── __init__.py
  5. ├── settings.py 【配置文件,只有一部分。程序启动时,先读取django内部配置,再读settings.py】
  6. ├── urls.py 【主路由,在里面编写 /xxx/xxx/xxx ---> index 】
  7. ├── asgi.py 【异步】
  8. └── wsgi.py 【同步,主】

编写代码

在urls.py中编写

  1. from django.contrib import admin
  2. from django.urls import path
  3. from django.shortcuts import HttpResponse
  4. def info(request):
  5. print("请求来执行了")
  6. return HttpResponse("xxxx")
  7. def xxxx(request):
  8. print("请求来执行了")
  9. return HttpResponse("。。。。。。")
  10. urlpatterns = [
  11. # path('admin/', admin.site.urls),
  12. path('api/index/', info),
  13. path('api/show/', xxxx),
  14. ]

运行

  1. cd 项目
  2. python manage.py runserver
  3. python manage.py runserver 127.0.0.1:8000
  4. python manage.py runserver 127.0.0.1:9000

访问http://127.0.0.1:8000/api/index/

app概念

  1. cd 项目
  2. python manage.py startapp 名字
  1. django_demo01
  2. ├── manage.py [项目的管理工具]
  3. ├── web
  4. ├── __init__.py
  5. ├── views.py [视图函数]
  6. ├── models.py [ORM,基于models可以对数据库进行简便的操作]
  7. ...
  8. └── django_demo01
  9. ├── __init__.py
  10. ├── settings.py 【配置文件,只有一部分。程序启动时,先读取django内部配置,再读settings.py】
  11. ├── urls.py 【主路由,在里面编写 /xxx/xxx/xxx ---> index 】
  12. ├── asgi.py 【异步】
  13. └── wsgi.py 【同步,主】

app的概念其实就是按业务分,比如一个项目中,支付功能一个app、订单功能一个app,有点像Java里微服务的意思。

现在我们把刚才写的两个方法的代码放到web/views.py中:

修改urls.py代码:

启动项目:

1.3、Pycharm创建项目

直接点击启动项目:

1.4、虚拟环境

注意:以后再创建项目时,不要一直用系统解释器,为每个项目:虚拟环境 + 项目文件。

创建虚拟环境 - 命令行

介绍
  • venv,Python官方用于创建虚拟环境的工具。
  1. cd xxx/xxx/crm
  2. python3.9 -m venv ddd
  3. python3.7 -m venv xxxx
  4. python3.7 -m venv /xxx/xxx/xxx/xx/ppp
  • virtualenv 【推荐】
pip install virtualenv
  1. cd /xxx/xx/
  2. virtualenv ddd --python=python3.9
virtualenv /xxx/xx/ddd --python=python3.7

操作

第一步:pip安装virtualenv

pip install virtualenv

第二步:在D:\study\python\envs创建虚拟环境

virtualenv crm --python=python3.9

注意:crm是我们的虚拟环境名,随便起。

第三步:激活虚拟环境

  1. cd D:\study\python\envs\crm\Scripts
  2. activate

第四步:虚拟环境中安装Django包

pip install django==3.2

第五步:创建django项目

  1. cd D:\study\python\projects
  2. django-admin startproject crm

注意:这里的crm是项目名。

第六步:退出虚拟环境

deactivate

基本问题

问题1:如何删除虚拟环境?

直接删文件夹即可。比如我们上面例子虚拟环境文件夹叫crm,直接删除。

问题2:使用virtualenv创建虚拟环境时,Python3.9的系统环境可以创建Python3.7虚拟环境吗?

不可以,你系统环境Python是什么版本只能创建什么版本的虚拟环境。

Pycharm

项目+虚拟环境

我的习惯一般在venv前面加上点,默认让它隐藏。

django+虚拟环境【安装django最新版本】

注意:这种方式默认pip install django命令安装,安装的是最新版本的django。

django+虚拟环境【安装指定版本django】

第一步:我们先创建普通Python项目

第二步:打开终端,输入安装3.2版本django命令

pip install django==3.2

第三步:在终端输入如下命令

django-admin startproject django_test01 .

第四步:添加django服务

第五步:启动django服务

1.5、关于创建app

第一步:先安装指定版本的django项目

第二步:项目下右键创建apps文件夹

注意:apps文件夹里包括各种模块的文件。

第三步:在apps文件夹下随便创建几个文件代表模块

第四步:分别为模块创建app

在终端中分别输入:

  1. python manage.py startapp api apps/api
  2. python manage.py startapp backend apps/backend
  3. python manage.py startapp web apps/web

第五步:修改这三个模块apps文件里的name属性

这就是一个完整的django多app应用结构了。

二、路由

2.1、传统的路由

urls.py

  1. from django.contrib import admin
  2. from django.urls import path
  3. from apps.web import views
  4. urlpatterns = [
  5. path('home/', views.home),
  6. path('news/<int:nid>/edit/', views.news),
  7. path('article/', views.article),
  8. ]

path()第一个参数是我们需要在浏览器访问的url地址,第二个参数是函数名。

views.py

  1. from django.shortcuts import render, HttpResponse
  2. def home(request):
  3. return HttpResponse("成功")
  4. def news(request, nid):
  5. print(nid)
  6. page = request.GET.get("page")
  7. return HttpResponse("新闻")
  8. def article(request):
  9. nid = request.GET.get("nid")
  10. print(nid)
  11. return HttpResponse("文章")

传参的几种方式

(1)restful风格
  1. urlpatterns = [
  2. path('news/<int:nid>/edit/', views.news)
  3. ]
  1. def news(request, nid):
  2. print(nid) # 接收参数
  3. return HttpResponse("新闻")
'
运行

  • int,整数

  • str,字符串 /

  • slug,字母+数字+下滑线+-

  • uuid,uuid格式

  • path,路径,可以包含 /

注意:字符串你可以输入任何东西,比如aaa=bbb这种,但slug有等号就会报错,因为slug只能包含字母数字下划线。

(2)问号传参
  1. urlpatterns = [
  2. path('article/', views.article)
  3. ]
  1. def article(request):
  2. nid = request.GET.get("nid") # 接收参数
  3. print(nid)
  4. return HttpResponse("文章")
'
运行

2.2、正则表达式路由

  • 在django1版本用的多。

  • 在django2+版本用的少

2.3、路由分发

include分发

假如:200个功能。

include + app(一般),将功能拆分不到不同的app中。

第一步:在三个app模块中分别创建自己的urls.py文件

第二步:对api模块进行操作

views.py

  1. from django.shortcuts import render,HttpResponse
  2. def getApiName(request):
  3. return HttpResponse("编程抗氧化——api")

urls.py

  1. urlpatterns = [
  2. path('getApiName/', views.getApiName),
  3. ]

第三步:对web模块进行操作

views.py

  1. from django.shortcuts import render, HttpResponse
  2. def getWebName(request):
  3. return HttpResponse("编程抗氧化——web")

urls.py

  1. urlpatterns = [
  2. path('getWebName/', views.getWebName),
  3. ]

第四步:在主urls.py中编码,引入其它模块的urls

  1. from django.contrib import admin
  2. from django.urls import path,include
  3. urlpatterns = [
  4. path('api/', include("apps.api.urls")),
  5. path('web/', include("apps.web.urls")),
  6. ]

第五步:测试

当我们路径带有api或者web,自动匹配到主urls.py,然后找对应的include为我们分发到下面子模块的urls.py中。

手动分发

有时候我们可能项目没那么多功能,也就用不着创建多个app模块,假如说我们现在就一个模块,有用户的增删改查、角色的增删改查、菜单的增删改查等等... 那么urls.py就得是这样的:

  1. path('user/add/', views.userAdd),
  2. path('user/delete/', views.userDelete),
  3. path('user/edit/', views.userEdit),
  4. path('user/list/', views.userList),
  5. path('role/add/', views.roleAdd),
  6. path('role/delete/', views.roleDelete),
  7. path('role/edit/', views.roleEdit),
  8. path('role/list/', views.roleList),
  9. path('menu/add/', views.menuAdd),
  10. path('menu/delete/', views.menuDelete),
  11. path('menu/edit/', views.menuEdit),
  12. path('menu/list/', views.menuList),

看起来很冗杂,而且好多路径都是重复的,那么我们可以使用手动分发的方式去处理这种情况:

  1. path('user/', ([
  2. path('add/', views.userAdd),
  3. path('delete/', views.userDelete),
  4. path('edit/', views.userEdit),
  5. path('list/', views.userList),
  6. ], None, None)),
  7. path('role/', ([
  8. path('add/', views.roleAdd),
  9. path('delete/', views.roleDelete),
  10. path('edit/', views.roleEdit),
  11. path('list/', views.roleList),
  12. ], None, None)),
  13. path('menu/', ([
  14. path('add/', views.menuAdd),
  15. path('delete/', views.menuDelete),
  16. path('edit/', views.menuEdit),
  17. path('list/', views.menuList),
  18. ], None, None)),

这样看起来是不是就轻松多了。

2.4、name属性

给一个路由起个名字 + 根据名字反向生成URL。

  1. from django.contrib import admin
  2. from django.urls import path
  3. from django_test01 import views
  4. # 很多功能,很多URL
  5. urlpatterns = [
  6. path('login/', views.login, name="v1"),
  7. path('auth/', views.auth, name="v2"),
  8. ]

其实就是起个名字。

有了名字后,以后一般有两处会用到:

(1)在视图函数中生成URL

比如我有一个需求:浏览器访问/login,在login方法中再跳转到auth方法,这时我们的做法是:

urls.py

  1. from django.contrib import admin
  2. from django.urls import path
  3. from django_test01 import views
  4. # 很多功能,很多URL
  5. urlpatterns = [
  6. path('login/', views.login, name="v1"),
  7. path('auth/', views.auth, name="v2"),
  8. ]

views.py

  1. from django.shortcuts import render, HttpResponse, redirect
  2. def auth(request):
  3. return HttpResponse("auth")
  4. def login(request):
  5. return redirect("/auth/") # 重定向到/auth

当我们访问http://localhost:8000/login 时调用了auth方法。

那么说了这么多,name的作用在哪呢?别急,这就告诉你...

我们可以将上面views.py的代码改为:

  1. from django.shortcuts import render, HttpResponse, redirect
  2. def auth(request):
  3. return HttpResponse("auth")
  4. def login(request):
  5. from django.urls import reverse
  6. url = reverse("v2") # /auth/
  7. return redirect(url)

我们可以通过reverse方法来获得name="v2"的url路径,这样写法就灵活多了。

(2)HTML模板,页面上有一个a标签,添加xx

  1. <a href="{% url 'v1' %}">添加</a>
  2. <a href="{% url 'v2' %}">添加</a>

2.5、namespace

辅助name。

主路由:

  1. from django.urls import path, re_path, include
  2. # 很多功能,很多URL
  3. urlpatterns = [
  4. path('api/', include("apps.api.urls",namespace='x1')),
  5. path('web/', include("apps.web.urls",namespace='x2')),
  6. ]

api/urls.py

  1. from django.urls import path, re_path
  2. from . import views
  3. # 很多功能,很多URL
  4. urlpatterns = [
  5. path('login/', views.login,name="login"),
  6. path('auth/', views.auth, name='auth'),
  7. ]

web/urls.py

  1. from django.urls import path, re_path
  2. from . import views
  3. # 很多功能,很多URL
  4. urlpatterns = [
  5. path('home/', views.home,name='home'),
  6. path('order/', views.order,name='order'),
  7. path('auth/', views.order, name='auth'),
  8. ]

以后再某个URL或者视图中反向生成:

  1. from django.urls import reverse
  2. url = reverse("x1:login") # /api/login/
  3. url = reverse("x1:order") # /web/login/
  4. url = reverse("x1:auth") # /api/login/
  5. url = reverse("x2:auth") # /web/login/

2.6、namespace扩展

namespace需要设置app_name

主路由

  1. urlpatterns = [
  2. path('api/', include("apps.api.urls", namespace='x1')),
  3. ]

api/urls.py

  1. from django.urls import path, re_path
  2. from apps.api import views
  3. # 很多功能,很多URL
  4. urlpatterns = [
  5. path('login/', views.login, name="login"),
  6. path('auth/', views.auth, name='auth'),
  7. ]
  8. app_name = "api"

手动分发

2.7、最后的 / 如何解决?

当在settings.py中设置 APPEND_SLASH = True

  1. path('login/', views.login),
  2. http://127.0.0.1:8000/login/ 成功
  3. http://127.0.0.1:8000/login django,重定向301
  4. http://127.0.0.1:8000/login/ 成功

当我们访问http://127.0.0.1:8000/login/ 直接访问成功,这不多说!!!

但当我们访问http://127.0.0.1:8000/login 发现django会自动为我们补上最后一个斜杠,这是因为请求第一次没带斜杠django会为我们重定向到带斜杠的路径。

  1. path('login', views.login),
  2. http://127.0.0.1:8000/login 成功
  3. http://127.0.0.1:8000/login
  4. http://127.0.0.1:8000/login/ 失败

APPEND_SLASH = False

  1. path('login/', views.login),
  2. http://127.0.0.1:8000/login/ 成功
  3. http://127.0.0.1:8000/login 失败
  1. path('login', views.login),
  2. http://127.0.0.1:8000/login/ 失败
  3. http://127.0.0.1:8000/login 成功

设置了false,django不会自动为你加斜杠,该是什么就是什么。

2.8、当前匹配对象

有什么用呀?

  1. 某用户,具有一些权限。 permissions = ["xx","login",'account']
  2. 某用户,具有一些权限。 permissions = ["login",'account']

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号