我们写的网站后台和我们看的后台不一样,也可以改进。建议自己写后台。
使用django自带的后台,把django的表跑起来
前提INSTALLED_APPS需要注册,并迁移过
python manage.py runserver 0.0.0.0:8000
现在需要认证,
auth_user 认证,分组权限管理
bashmysql> 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
现在只有用户和组, 现在需要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)
员工的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
注意最后一个没有显示名,其他有定义就有
一般不使用这个
也有开源的后台,开源的代码别人就知道你的漏洞,所以自己写一般找不到漏洞
用户 -> (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 ]
返回
============================== 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 ]
============================== 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/test | http://localhost:8000/test/ | 官方 |
---|---|---|---|
path('test', path_test) | 可以匹配 | 不可以匹配 | |
path('test/', path_test) | 可以匹配,301重定向到 http://localhost:8000/test/ | 可以匹配 | 建议 |
站点配置目录下的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
响应的字符,默认识别为text/html,不是html结构,所以浏览器就补全了。
difffrom 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
现在就是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 许可协议。转载请注明出处!