2022-05-21
devops
00
请注意,本文编写于 678 天前,最后修改于 678 天前,其中某些信息可能已经过时。

目录

后台管理
进入后台
employee 后台管理
员工管理
model
网页添加
后台
路由
配置路由
路由优先级
路由命名分组
普通匹配
转换匹配
路径匹配/结束
路由体系
主路由, 1级路由
应用路由,二级路由
测试访问
项目脚手架结构
结构
正常访问
修改字符集

后台管理

我们写的网站后台和我们看的后台不一样,也可以改进。建议自己写后台。

使用django自带的后台,把django的表跑起来

前提INSTALLED_APPS需要注册,并迁移过

python manage.py runserver 0.0.0.0:8000

进入后台

http://localhost:8000/admin

image-20220424125329769

现在需要认证,

  • auth_user 认证,分组权限管理

    bash
    mysql> SELECT * FROM auth_user; Empty set (0.00 sec) mysql> DESC auth_user; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | password | varchar(128) | NO | | NULL | | | last_login | datetime(6) | YES | | NULL | | | is_superuser | tinyint(1) | NO | | NULL | | | username | varchar(150) | NO | UNI | NULL | | | first_name | varchar(150) | NO | | NULL | | | last_name | varchar(150) | NO | | NULL | | | email | varchar(254) | NO | | NULL | | | is_staff | tinyint(1) | NO | | NULL | | | is_active | tinyint(1) | NO | | NULL | | | date_joined | datetime(6) | NO | | NULL | | +--------------+--------------+------+-----+---------+----------------+ 11 rows in set (0.00 sec) # 准备用户 python manage.py createsuperuser #INSERT INTO `auth_user` (`password`, `last_login`, `is_superuser`, `username`, `first_name`, `last_name`, `email`, `is_staff`, `is_active`, `date_joined`) VALUES ('pbkdf2_sha256$260000$ADPfwSijBMDMww0wfuPFe3$Gec6kaewzouSUUzn4xa vS7mJaW8PdSc4W8u0GiuIizc=', NULL, 1, 'admin', '', '', 'admin@magedu.com', 1, 1, '2022-04-24 04:57:08.515799')
  • 自己写

现在可以登陆了

mysql> SELECT * FROM auth_user\G; *************************** 1. row *************************** id: 1 password: pbkdf2_sha256$260000$ADPfwSijBMDMww0wfuPFe3$Gec6kaewzouSUUzn4xavS7mJaW8PdSc4W8u0GiuIizc= last_login: NULL is_superuser: 1 username: admin first_name: last_name: email: admin@magedu.com is_staff: 1 is_active: 1 date_joined: 2022-04-24 04:57:08.515799 1 row in set (0.00 sec) ERROR: No query specified

image-20220424125955074

现在只有用户和组, 现在需要employee应用表,在后台管理

employee 后台管理

employee/admin.py

from django.contrib import admin # Register your models here. from .models import Employee, Department, Dept_emp admin.site.register(Employee) admin.site.register(Department) admin.site.register(Dept_emp)

image-20220424130238879

员工管理

model

员工的model如下 employee/models.py

class Employee(models.Model): class Meta: db_table = 'employees' emp_no = models.BigIntegerField(primary_key=True, verbose_name='工号') birth_date = models.DateField(verbose_name='生日') first_name = models.CharField(max_length=14, verbose_name='名') last_name = models.CharField(max_length=16, verbose_name='姓') gender = models.CharField(max_length=1,choices=Gender.choices, verbose_name='性别') # hire_date = models.DateField(verbose_name='雇佣时间') hire_date = models.DateField() @property def name(self): return f'[{self.last_name} {self.first_name}]' def __repr__(self): return f'<Employ {self.emp_no} {self.name}>' __str__ = __repr__

注意 hire_date = models.DateField() 没有 verbose

网页添加

img

注意最后一个没有显示名,其他有定义就有

后台

一般不使用这个

也有开源的后台,开源的代码别人就知道你的漏洞,所以自己写一般找不到漏洞

路由

用户 -> (www -动态-> wsgi ( app(environ,start_response) )) -> 封装响应

所有请求给app, 查询字符串,提交的数据,URL可以变化。

之前url变化找不同的静态文件。现在url变化找不同的处理函数。

/index.html -> $docroot/index.html /test.html -> $docroot/test.html /index.jsp -> 代码运行之后,生成html python中,不同url均给 app(environ,start_resopnse), app函数需要对不同URL做不同处理。不同URL对应APP内部不同的函数。 urls.py router_map = { '/index': h1, '/test': h2 } views.py from urls import router_map def app(env, sr): # 不同URL映射不同函数 x = router_map.get(request.path,handler_default)() sr('200 OK', [(key,value)]) return [x] if url == "/index": # 区别不同url x = handler1() elif url == "/test": x = handler2() else: x = handler_default()

django 3.1 开始不使用绝对路径,支持正则路径 re_path

配置路由

https://docs.djangoproject.com/en/4.0/#the-view-layer

The basics: URLconfs

settings.py中定义了,路由映射的起始 ROOT_URLCONF = 'salary.urls'

现在定义urls.py

"""salary URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/3.2/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path # 写在这里不好,仅测试,第1参数必须是reqeusts, 请求对象,environ在交给你之前,已经对象化, 不用.get, 直接使用属性。 from django.http import HttpResponse,HttpRequest def path_test(request:HttpRequest,*args,**kwargs): print('='*30) print(1,request, request.path, request.path_info) print(2,args) print(3,kwargs) print('='*30) return HttpResponse(b'magedu.com') urlpatterns = [ path('admin/', admin.site.urls), path('test', path_test), path('', path_test), # website root ]

image-20220424142944078返回

============================== 1 <WSGIRequest: GET '/'> / / 2 () 3 {} ============================== [24/Apr/2022 14:28:48] "GET / HTTP/1.1" 200 10

http://localhost:8000/test 访问结果

============================== 1 <WSGIRequest: GET '/test'> /test /test 2 () 3 {} ============================== [24/Apr/2022 14:29:57] "GET /test HTTP/1.1" 200 10

路由优先级

"""salary URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/3.2/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path # 写在这里不好,仅测试,第1参数必须是reqeusts, 请求对象,environ在交给你之前,已经对象化, 不用.get, 直接使用属性。 from django.http import HttpResponse,HttpRequest def path_test(request:HttpRequest,*args,**kwargs): print('='*30) print(1,request, request.path, request.path_info) print(2,args) print(3,kwargs) print('='*30) return HttpResponse(b'magedu.com') def test(request): return HttpResponse(b'test2') urlpatterns = [ path('admin/', admin.site.urls), path('test', path_test), path('test', test), path('', path_test), # website root ]

访问 http://localhost:8000/test

============================== 1 <WSGIRequest: GET '/test'> /test /test 2 () 3 {} ============================== [24/Apr/2022 14:31:34] "GET /test HTTP/1.1" 200 10

说明前端的路径优先生效

路由命名分组

普通匹配

"""salary URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/3.2/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path # 写在这里不好,仅测试,第1参数必须是reqeusts, 请求对象,environ在交给你之前,已经对象化, 不用.get, 直接使用属性。 from django.http import HttpResponse,HttpRequest def path_test(request:HttpRequest,*args,**kwargs): print('='*30) print(1,request, request.path, request.path_info) print(2,args) print(3,kwargs) print('='*30) return HttpResponse(b'magedu.com') def test(request): return HttpResponse(b'test2') urlpatterns = [ path('admin/', admin.site.urls), path('test', path_test), path('', path_test), # website root path('test/<course>/<year>', path_test), # path_test(request, **{'course': 'python', 'year': '2022'}) ]

访问 http://localhost:8000/test 匹配 path_test

访问 http://localhost:8000/test/python/2022

============================== 1 <WSGIRequest: GET '/test/python/2022'> /test/python/2022 /test/python/2022 2 () 3 {'course': 'python', 'year': '2022'} ============================== [24/Apr/2022 14:34:12] "GET /test/python/2022 HTTP/1.1" 200 10

说明匹配之后,等价 path_test(request, **{'course': 'python', 'year': '2022'})

转换匹配

django支持的转换器: https://docs.djangoproject.com/en/4.0/topics/http/urls/#path-converters

diff
"""salary URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/3.2/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path # 写在这里不好,仅测试,第1参数必须是reqeusts, 请求对象,environ在交给你之前,已经对象化, 不用.get, 直接使用属性。 from django.http import HttpResponse,HttpRequest def path_test(request:HttpRequest,*args,**kwargs): print('='*30) print(1,request, request.path, request.path_info) print(2,args) print(3,kwargs) + print(4,*map(lambda x: (type(x),x),kwargs.values())) print('='*30) return HttpResponse(b'magedu.com') def test(request): return HttpResponse(b'test2') urlpatterns = [ path('admin/', admin.site.urls), path('test', path_test), path('', path_test), # website root path('test/<course>/<year>', path_test) ]

默认转换为字符 , 相当于 path('test/<str:course>/<str:year>', path_test)

============================== 1 <WSGIRequest: GET '/test/python/2022'> /test/python/2022 /test/python/2022 2 () 3 {'course': 'python', 'year': '2022'} 4 (<class 'str'>, 'python') (<class 'str'>, '2022') ============================== [24/Apr/2022 14:38:04] "GET /test/python/2022 HTTP/1.1" 200 10

现在转换为整型

diff
"""salary URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/3.2/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path # 写在这里不好,仅测试,第1参数必须是reqeusts, 请求对象,environ在交给你之前,已经对象化, 不用.get, 直接使用属性。 from django.http import HttpResponse,HttpRequest def path_test(request:HttpRequest,*args,**kwargs): print('='*30) print(1,request, request.path, request.path_info) print(2,args) print(3,kwargs) print(4,*map(lambda x: (type(x),x),kwargs.values())) print('='*30) return HttpResponse(b'magedu.com') def test(request): return HttpResponse(b'test2') urlpatterns = [ path('admin/', admin.site.urls), path('test', path_test), path('', path_test), # website root + path('test/<course>/<int:year>', path_test) ]
============================== 1 <WSGIRequest: GET '/test/python/2022'> /test/python/2022 /test/python/2022 2 () 3 {'course': 'python', 'year': 2022} 4 (<class 'str'>, 'python') (<class 'int'>, 2022) ============================== [24/Apr/2022 14:39:54] "GET /test/python/2022 HTTP/1.1" 200 10

现在数值

当写的转换为int, 如果请求 http://localhost:8000/test/python/abc

返回404,说明abc不能转换为整型

路径匹配/结束

"""salary URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/3.2/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path # 写在这里不好,仅测试,第1参数必须是reqeusts, 请求对象,environ在交给你之前,已经对象化, 不用.get, 直接使用属性。 from django.http import HttpResponse,HttpRequest def path_test(request:HttpRequest,*args,**kwargs): print('='*30) print(1,request, request.path, request.path_info) print(2,args) print(3,kwargs) print(4,*map(lambda x: (type(x),x),kwargs.values())) print('='*30) return HttpResponse(b'magedu.com') def test(request): return HttpResponse(b'test2') urlpatterns = [ path('admin/', admin.site.urls), path('test', path_test), # website root ]
path模式http://localhost:8000/testhttp://localhost:8000/test/官方
path('test', path_test)可以匹配不可以匹配
path('test/', path_test)可以匹配,301重定向到 http://localhost:8000/test/可以匹配建议

路由体系

主路由, 1级路由

站点配置目录下的Urls salary/urls.py

"""salary URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/3.2/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path, include # 主路由 urlpatterns = [ path('admin/', admin.site.urls), path('emp/', include('employee.urls')), # 2级路由一定要/ ]

应用路由,二级路由

employee/urls.py

print(f'加载到 {__name__}') from django.urls import path # 写在这里不好,仅测试,第1参数必须是reqeusts, 请求对象,environ在交给你之前,已经对象化, 不用.get, 直接使用属性。 from django.http import HttpResponse,HttpRequest def path_test(request:HttpRequest,*args,**kwargs): print('='*30) print(1,request, request.path, request.path_info) print(2,args) print(3,kwargs) print(4,*map(lambda x: (type(x),x),kwargs.values())) print('='*30) return HttpResponse(b'magedu.com') def test(request): return HttpResponse(b'test2') # 主路由 urlpatterns = [ path('test/', path_test), # website root ] print(f'加载结束 {__name__}')

测试访问

http://localhost:8000/emp/test/

============================== 1 <WSGIRequest: GET '/emp/test/'> /emp/test/ /emp/test/ 2 () 3 {} 4 ============================== [24/Apr/2022 15:01:21] "GET /emp/test/ HTTP/1.1" 200 10

项目脚手架结构

结构

要求urls写路由映射,views写函数,modals中写modal类

employee/urls.py

print(f'加载到 {__name__}') from django.urls import path from .views import index # 主路由 urlpatterns = [ path('index/<int:id>', index), # website root ] print(f'加载结束 {__name__}')

employee/views.py

from django.shortcuts import render from django.http import HttpResponse, HttpRequest # Create your views here. def index(request: HttpRequest, id): print('='*30) print(1,request, request.path, request.path_info) print(3,type(id), id) print('='*30) return HttpResponse('准备开始使用模板')

正常访问

现在访问http://localhost:8000/emp/index/123

Quit the server with CTRL-BREAK. ============================== 1 <WSGIRequest: GET '/emp/index/123'> /emp/index/123 /emp/index/123 3 <class 'int'> 123 ============================== [24/Apr/2022 15:45:31] "GET /emp/index/123 HTTP/1.1" 200 24

img

image-20220424155617963

响应的字符,默认识别为text/html,不是html结构,所以浏览器就补全了。

修改字符集

diff
from django.shortcuts import render from django.http import HttpResponse, HttpRequest # Create your views here. def index(request: HttpRequest, id): print('='*30) print(1,request, request.path, request.path_info) print(3,type(id), id) print('='*30) + res = HttpResponse('准备开始使用模板', charset='gbk') + print(res.charset) return res

image-20220424160025003

现在就是gbk了, 浏览器按声称的编码显示。

现在如果是utf8的字符

from django.shortcuts import render from django.http import HttpResponse, HttpRequest # Create your views here. def index(request: HttpRequest, id): print('='*30) print(1,request, request.path, request.path_info) print(3,type(id), id) print('='*30) res = HttpResponse('准备开始使用模板'.encode(encoding='utf8'), charset='gbk') print(res.charset) return res

浏览器使用firefox,修复编码,即可。

本文作者:mykernel

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!