赞
踩
目录
pip install django==3.2
- C:\Python39
- - python.exe
- - Scripts
- - pip.exe
- - django-admin.exe
- - Lib
- - re.py
- - random.py
- - site-pakages
- - django==3.2
- ...
- cd 指定目录
- django-admin startproject 项目名
- django_demo01
- ├── manage.py [项目的管理工具]
- └── django_demo01
- ├── __init__.py
- ├── settings.py 【配置文件,只有一部分。程序启动时,先读取django内部配置,再读settings.py】
- ├── urls.py 【主路由,在里面编写 /xxx/xxx/xxx ---> index 】
- ├── asgi.py 【异步】
- └── wsgi.py 【同步,主】
在urls.py中编写
- from django.contrib import admin
- from django.urls import path
-
- from django.shortcuts import HttpResponse
-
- def info(request):
- print("请求来执行了")
- return HttpResponse("xxxx")
-
- def xxxx(request):
- print("请求来执行了")
- return HttpResponse("。。。。。。")
-
- urlpatterns = [
- # path('admin/', admin.site.urls),
- path('api/index/', info),
- path('api/show/', xxxx),
- ]
- cd 项目
- python manage.py runserver
- python manage.py runserver 127.0.0.1:8000
- python manage.py runserver 127.0.0.1:9000
访问http://127.0.0.1:8000/api/index/
- cd 项目
- python manage.py startapp 名字
- django_demo01
- ├── manage.py [项目的管理工具]
- ├── web
- ├── __init__.py
- ├── views.py [视图函数]
- ├── models.py [ORM,基于models可以对数据库进行简便的操作]
- ...
- └── django_demo01
- ├── __init__.py
- ├── settings.py 【配置文件,只有一部分。程序启动时,先读取django内部配置,再读settings.py】
- ├── urls.py 【主路由,在里面编写 /xxx/xxx/xxx ---> index 】
- ├── asgi.py 【异步】
- └── wsgi.py 【同步,主】
app的概念其实就是按业务分,比如一个项目中,支付功能一个app、订单功能一个app,有点像Java里微服务的意思。
现在我们把刚才写的两个方法的代码放到web/views.py中:
修改urls.py代码:
启动项目:
直接点击启动项目:
注意:以后再创建项目时,不要一直用系统解释器,为每个项目:虚拟环境 + 项目文件。
- cd xxx/xxx/crm
- python3.9 -m venv ddd
- python3.7 -m venv xxxx
- python3.7 -m venv /xxx/xxx/xxx/xx/ppp
pip install virtualenv
- cd /xxx/xx/
- 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是我们的虚拟环境名,随便起。
第三步:激活虚拟环境
- cd D:\study\python\envs\crm\Scripts
- activate
第四步:虚拟环境中安装Django包
pip install django==3.2
第五步:创建django项目
- cd D:\study\python\projects
- django-admin startproject crm
注意:这里的crm是项目名。
第六步:退出虚拟环境
deactivate
问题1:如何删除虚拟环境?
直接删文件夹即可。比如我们上面例子虚拟环境文件夹叫crm,直接删除。
问题2:使用virtualenv创建虚拟环境时,Python3.9的系统环境可以创建Python3.7虚拟环境吗?
不可以,你系统环境Python是什么版本只能创建什么版本的虚拟环境。
我的习惯一般在venv前面加上点,默认让它隐藏。
注意:这种方式默认pip install django命令安装,安装的是最新版本的django。
第一步:我们先创建普通Python项目
第二步:打开终端,输入安装3.2版本django命令
pip install django==3.2
第三步:在终端输入如下命令
django-admin startproject django_test01 .
第四步:添加django服务
第五步:启动django服务
第一步:先安装指定版本的django项目
第二步:项目下右键创建apps文件夹
注意:apps文件夹里包括各种模块的文件。
第三步:在apps文件夹下随便创建几个文件代表模块
第四步:分别为模块创建app
在终端中分别输入:
- python manage.py startapp api apps/api
- python manage.py startapp backend apps/backend
- python manage.py startapp web apps/web
第五步:修改这三个模块apps文件里的name属性
这就是一个完整的django多app应用结构了。
urls.py
- from django.contrib import admin
- from django.urls import path
- from apps.web import views
-
- urlpatterns = [
- path('home/', views.home),
- path('news/<int:nid>/edit/', views.news),
- path('article/', views.article),
- ]
path()第一个参数是我们需要在浏览器访问的url地址,第二个参数是函数名。
views.py
- from django.shortcuts import render, HttpResponse
-
-
- def home(request):
- return HttpResponse("成功")
-
-
- def news(request, nid):
- print(nid)
- page = request.GET.get("page")
- return HttpResponse("新闻")
-
-
- def article(request):
- nid = request.GET.get("nid")
- print(nid)
- return HttpResponse("文章")
- urlpatterns = [
- path('news/<int:nid>/edit/', views.news)
- ]
- def news(request, nid):
- print(nid) # 接收参数
- return HttpResponse("新闻")
'运行
int,整数
str,字符串 /
slug,字母+数字+下滑线+-
uuid,uuid格式
path,路径,可以包含 /
注意:字符串你可以输入任何东西,比如aaa=bbb这种,但slug有等号就会报错,因为slug只能包含字母数字下划线。
- urlpatterns = [
- path('article/', views.article)
- ]
- def article(request):
- nid = request.GET.get("nid") # 接收参数
- print(nid)
- return HttpResponse("文章")
'运行
在django1版本用的多。
在django2+版本用的少
假如:200个功能。
include + app(一般),将功能拆分不到不同的app中。
第一步:在三个app模块中分别创建自己的urls.py文件
第二步:对api模块进行操作
views.py
- from django.shortcuts import render,HttpResponse
-
- def getApiName(request):
- return HttpResponse("编程抗氧化——api")
urls.py
- urlpatterns = [
- path('getApiName/', views.getApiName),
- ]
第三步:对web模块进行操作
views.py
- from django.shortcuts import render, HttpResponse
-
-
- def getWebName(request):
- return HttpResponse("编程抗氧化——web")
urls.py
- urlpatterns = [
- path('getWebName/', views.getWebName),
- ]
第四步:在主urls.py中编码,引入其它模块的urls
- from django.contrib import admin
- from django.urls import path,include
-
- urlpatterns = [
- path('api/', include("apps.api.urls")),
- path('web/', include("apps.web.urls")),
- ]
第五步:测试
当我们路径带有api或者web,自动匹配到主urls.py,然后找对应的include为我们分发到下面子模块的urls.py中。
有时候我们可能项目没那么多功能,也就用不着创建多个app模块,假如说我们现在就一个模块,有用户的增删改查、角色的增删改查、菜单的增删改查等等... 那么urls.py就得是这样的:
- path('user/add/', views.userAdd),
- path('user/delete/', views.userDelete),
- path('user/edit/', views.userEdit),
- path('user/list/', views.userList),
-
- path('role/add/', views.roleAdd),
- path('role/delete/', views.roleDelete),
- path('role/edit/', views.roleEdit),
- path('role/list/', views.roleList),
-
- path('menu/add/', views.menuAdd),
- path('menu/delete/', views.menuDelete),
- path('menu/edit/', views.menuEdit),
- path('menu/list/', views.menuList),
看起来很冗杂,而且好多路径都是重复的,那么我们可以使用手动分发的方式去处理这种情况:
- path('user/', ([
- path('add/', views.userAdd),
- path('delete/', views.userDelete),
- path('edit/', views.userEdit),
- path('list/', views.userList),
- ], None, None)),
-
-
- path('role/', ([
- path('add/', views.roleAdd),
- path('delete/', views.roleDelete),
- path('edit/', views.roleEdit),
- path('list/', views.roleList),
- ], None, None)),
-
-
- path('menu/', ([
- path('add/', views.menuAdd),
- path('delete/', views.menuDelete),
- path('edit/', views.menuEdit),
- path('list/', views.menuList),
- ], None, None)),
这样看起来是不是就轻松多了。
给一个路由起个名字 + 根据名字反向生成URL。
- from django.contrib import admin
- from django.urls import path
- from django_test01 import views
-
- # 很多功能,很多URL
- urlpatterns = [
- path('login/', views.login, name="v1"),
- path('auth/', views.auth, name="v2"),
- ]
其实就是起个名字。
有了名字后,以后一般有两处会用到:
(1)在视图函数中生成URL
比如我有一个需求:浏览器访问/login,在login方法中再跳转到auth方法,这时我们的做法是:
urls.py
- from django.contrib import admin
- from django.urls import path
- from django_test01 import views
-
- # 很多功能,很多URL
- urlpatterns = [
- path('login/', views.login, name="v1"),
- path('auth/', views.auth, name="v2"),
- ]
views.py
- from django.shortcuts import render, HttpResponse, redirect
-
- def auth(request):
- return HttpResponse("auth")
-
-
- def login(request):
- return redirect("/auth/") # 重定向到/auth
当我们访问http://localhost:8000/login 时调用了auth方法。
那么说了这么多,name的作用在哪呢?别急,这就告诉你...
我们可以将上面views.py的代码改为:
- from django.shortcuts import render, HttpResponse, redirect
-
- def auth(request):
- return HttpResponse("auth")
-
-
- def login(request):
- from django.urls import reverse
- url = reverse("v2") # /auth/
- return redirect(url)
我们可以通过reverse方法来获得name="v2"的url路径,这样写法就灵活多了。
(2)HTML模板,页面上有一个a标签,添加xx
- <a href="{% url 'v1' %}">添加</a>
- <a href="{% url 'v2' %}">添加</a>
辅助name。
主路由:
- from django.urls import path, re_path, include
-
- # 很多功能,很多URL
- urlpatterns = [
- path('api/', include("apps.api.urls",namespace='x1')),
- path('web/', include("apps.web.urls",namespace='x2')),
- ]
api/urls.py
- from django.urls import path, re_path
- from . import views
- # 很多功能,很多URL
- urlpatterns = [
- path('login/', views.login,name="login"),
- path('auth/', views.auth, name='auth'),
- ]
web/urls.py
- from django.urls import path, re_path
- from . import views
- # 很多功能,很多URL
- urlpatterns = [
- path('home/', views.home,name='home'),
- path('order/', views.order,name='order'),
- path('auth/', views.order, name='auth'),
- ]
以后再某个URL或者视图中反向生成:
- from django.urls import reverse
- url = reverse("x1:login") # /api/login/
- url = reverse("x1:order") # /web/login/
-
- url = reverse("x1:auth") # /api/login/
- url = reverse("x2:auth") # /web/login/
主路由
- urlpatterns = [
- path('api/', include("apps.api.urls", namespace='x1')),
- ]
api/urls.py
- from django.urls import path, re_path
- from apps.api import views
-
- # 很多功能,很多URL
- urlpatterns = [
- path('login/', views.login, name="login"),
- path('auth/', views.auth, name='auth'),
- ]
-
- app_name = "api"
当在settings.py中设置 APPEND_SLASH = True
- path('login/', views.login),
- http://127.0.0.1:8000/login/ 成功
-
- http://127.0.0.1:8000/login django,重定向301
- http://127.0.0.1:8000/login/ 成功
当我们访问http://127.0.0.1:8000/login/ 直接访问成功,这不多说!!!
但当我们访问http://127.0.0.1:8000/login 发现django会自动为我们补上最后一个斜杠,这是因为请求第一次没带斜杠django会为我们重定向到带斜杠的路径。
- path('login', views.login),
- http://127.0.0.1:8000/login 成功
-
- http://127.0.0.1:8000/login
- http://127.0.0.1:8000/login/ 失败
APPEND_SLASH = False
- path('login/', views.login),
- http://127.0.0.1:8000/login/ 成功
-
- http://127.0.0.1:8000/login 失败
- path('login', views.login),
- http://127.0.0.1:8000/login/ 失败
-
- http://127.0.0.1:8000/login 成功
设置了false,django不会自动为你加斜杠,该是什么就是什么。
有什么用呀?
- 某用户,具有一些权限。 permissions = ["xx","login",'account']
- 某用户,具有一些权限。 permissions = ["login",'account']
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。