Day 3 Note Book
1.虚拟环境的安装
pip install virtualenv
#镜像安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 安装包```文件
#例如更新pip
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
2.环境安装到 目录
windows r cmd
终端直接 d:
进入其他盘 cd /d d:
# cd 进入到目录下安装虚拟环境
virtualenv xxx --python=python3.9 注释“xxx”是环境名称 一般是与项目名字同名
#通过绝对路径安装
virtualenv xxx/xx/xxx/xx --python=python3.9
注意:用pycharm创建虚拟环境和项目是new一个python file,不是去new django项目。
django 安装命令
pip install django==3.2
cd 到目录
django-admin startproject 项目名称 . 创建项目 加点会加到根目录
python manage.py startapp app01 创建app01
python manage.py runserver 127.0.0.1:8000 启动项目
drf 安装
pip install djangorestframework
添加app
INSTALLED_APPS = [
# 'django.contrib.admin',
# 'django.contrib.auth',
# 'django.contrib.contenttypes',
# 'django.contrib.sessions',
# 'django.contrib.messages',
'django.contrib.staticfiles',
'oderapp.apps.OderappConfig',
]
oderapp是自己创建的App,oderapp文件夹中apps中的OderappConfig 是一个函数的名字。
了解importlib
import importlib
path="111.222.333.444"
md=importlib.import_module(path)
print(md.age)
md2=getattr(md,"ch")
print(md2)
了解isinstance
isinstance(obj, (list, tuple)) #判断isinstance patterns 是列表还是元组,返回TRUE FLASE.
使用纯净版本django
正则表达式路由
- 在django1版本用的多。
- 在django2+版本用的少
假如:200个功能。
inlucde + app(一般),将功能拆分不到不同的app中。
1.在项目中创建一个apps
2.在apps文件夹创建app文件夹 比如有 api web....
3.终端运行 python manage.py startapp api apps/api
4.找到api文件下的app中name进行修改
class ApiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.api'
手动路由分发,可以与app无关。
path('user/add/', views.login),
path('user/delete/', views.login),
path('user/edit/', views.login),
path('user/list/', views.login),
path('user/', ([
path('add/', views.login),
path('delete/', views.login), # /user/delete/
path('edit/', views.login),
path('list/', views.login),
], None, None)),
纯粹帮助提取功能的URL,防止重复编写。
小结
-
include或手动元组列表,本质相同。
-
应用场景和意义,想要把一些URL前缀提取出来。
path('user/add/', views.login), path('user/delete/', views.login), path('user/edit/', views.login), path('user/list/', views.login), path('user/', ([ path('add/', views.login), path('delete/', views.login), # /user/delete/ path('edit/', views.login), path('list/', views.login), ], None, None)), path('users', include(([ path('add/', views.login), path('delete/', views.login), # /user/delete/ path('edit/', views.login), path('list/', views.login), ], None))), include("apps.api.urls") # 一般是每个app中urls urlpatterns = [ ]
3.4 name
给一个路由起个名字 + 根据名字反向生成URL。
urlpatterns = [
path('login/', views.login),
]
# 很多功能,很多URL
urlpatterns = [
path('login/', views.login, name="v1"),
path('auth/', views.auth, name="v2"),
]
有了名字后,以后一般有两处会用到:
-
在视图函数中生成URL
from django.urls import reverse url = reverse("v2") # /auth/ url = reverse("v1") # /login/
-
HTML模板,页面上有一个a标签,添加xx。
<a href="/xxx/xxx/xx/">添加</a>
<a href="{% url 'v1' %}">添加</a> <a href="{% url 'v2' %}">添加</a>
-
扩展
以后做权限管理,让name属性配合。
-
主路由
namespace写在主路由
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或者视图中反向生成reverse:
from django.urls import reverse
url = reverse("x1:login") # /api/login/ 使用reverse将namespace与name 反向生成路由地址
url = reverse("x1:order") # /web/login/
url = reverse("x1:auth") # /api/login/
url = reverse("x2:auth") # /web/login/
两个扩展:
-
namespace需要设置app_name
urlpatterns = [ path('api/', include("apps.api.urls", namespace='x1')), ]
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"
-
手动分发
添加文件夹
1.删除views新建App内views文件夹。
2.删除主目录下的templates,建App内templates文件夹。
3.新建static文件夹,内部添加plugins cs、js、image、自己的cs,同样也是建在app里面。
4.注册app
INSTALLED_APPS = [
# 'django.contrib.admin',
# 'django.contrib.auth',
# 'django.contrib.contenttypes',
# 'django.contrib.sessions',
# 'django.contrib.messages',
'django.contrib.staticfiles',
'web.apps.WebConfig'
]
5.连接数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'july_day06', # 数据库名字
'USER': 'root',
'PASSWORD': 'root123',
'HOST': '127.0.0.1', # ip
'PORT': 3306,
}
}
#连接池
DATABASES = {
"default": {
'ENGINE': 'dj_db_conn_pool.backends.mysql',
'NAME': 'day04', # 数据库名字
'USER': 'root',
'PASSWORD': 'root123',
'HOST': '127.0.0.1', # ip
'PORT': 3306,
'POOL_OPTIONS': {
'POOL_SIZE': 10, # 最小
'MAX_OVERFLOW': 10, # 在最小的基础上,还可以增加10个,即:最大20个。
'RECYCLE': 24 * 60 * 60, # 连接可以被重复用多久,超过会重新创建,-1表示永久。
'TIMEOUT':30, # 池中没有连接最多等待的时间。
}
}
}
安装 mysql 、mysqlclient与连接池
pip install pymysql
pip install mysqlclient
pip install django-db-connection-pool
创建models后 运行以下两步完成创建表在mysql
python manage.py makemigrations
python manage.py migrate
mysql 基础命令
创建 数据库 CREATE DATABASE 名字;
show database show tables
redis 安装
-
服务器 + redis安装启动
-
django
-
安装连接redis包
pip install django-redis
-
settings.py
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密码", } } }
-
手动操作redis
from django_redis import get_redis_connection conn = get_redis_connection("default") conn.set("xx","123123") conn.get("xx")
-
mysql更改执行路径
models如果是choices项的,在html中这样体现
{% for row in queryset %}
<td>{{ row.get_department_display }}</td>
{% end for %}
重点是 get_表名字_display
视图函数的另一种保存方式
# 两种方式都可以储存
1# Market = models.Market(department=dpt, name=name, password=pas, phone_number=phone)
Market.save()
2 # models.Market.objects.create(department=dpt, name=name, password=pas, phone_number=phone)
在项目中的 models.py 中添加以下类:
class Book(models.Model):
id = models.AutoField(primary_key=True) # id 会自动创建,可以手动写入
title = models.CharField(max_length=32) # 书籍名称
price = models.DecimalField(max_digits=5, decimal_places=2) # 书籍价格
publish = models.CharField(max_length=32) # 出版社名称
pub_date = models.DateField() # 出版时间
中间件
#utls/md
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings
from django.shortcuts import redirect
class UserInfo(object):
def __init__(self, name,row, id):
self.id = id
self.name = name
self.row=row
self.menu_name = None
self.text_list = []
class AuthMiddleware(MiddlewareMixin):
def is_white_url(self, request):
# 1.在白列表中的网站 直接跳过
if request.path_info in settings.NB_WHITE_URL:
return True
def process_request(self, request):
# 1.在白列表中的网站 直接跳过
if self.is_white_url(request):
return
# 获取session中的信息,能获取到登录
# {'role': mapping[role], 'name': user_object.username, 'id': user_object.id}
user_dict = request.session.get(settings.NB_SESSION_KEY)
# 没有获取 就返回登录
if not user_dict:
return redirect(settings.NB_LOGIN_URL)
print(user_dict, type(user_dict))
# 已登录,封装用户信息
request.nb_user = UserInfo(**user_dict)
print(request.nb_user)
def process_view(self, request, callback, callback_args, callback_kwargs):
print("chuqu")
##############简要###################################
process_request,基于他实现用户是否已登录,继续;未登录则返回登录界面。
- return None,继续向后访问
- return 对象,直接返回。
process_view,权限校验
- return None,继续向后访问
- return 对象,直接返回。
- 在他的request对象中有 resolver_match ,包含当前请求的视图路由信息 .name->sms_login
admin = ['sms_login',"xxx"]
process_response
menu 菜单
#settings/
NB_MENU = {
"PURCHASE": [
{
"tetx": "用户信息",
"icon": "fa-bed",
"children": [
{'text': "订单列表", 'url': "/market_list/", 'name': "level_list"}
]
},
],
'MARKET': [
{
'text': "用户信息",
'icon': "fa-bed",
'children': [
{'text': "级别管理", 'url': "/level/list/", 'name': "level_list"}
]
},
],
}
#menu.py
from django.template import Library
import copy
from django.conf import settings
register = Library()
@register.inclusion_tag("tag/nb_menu.html")
def nb_menu(request):
user_menu_list = copy.deepcopy(settings.NB_MENU[request.nb_user.row])
for item in user_menu_list:
for child in item['children']:
if child['name'] == request.nb_user.menu_name:
child['class'] = 'active'
return {'menu_list': user_menu_list}
#templates/tag/nb_user
<div class="multi-menu">
{% for item in menu_list %}
<div class="item">
<div class="title">
<span class="icon-wrap"><i class="fa {{ item.icon }}"></i></span> {{ item.text }}
</div>
<div class="body {{ item.class }}">
{% for child in item.children %}
<a class="{{ child.class }}" href="{{ child.url }}">{{ child.text }}</a>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
#要导入的HTML文件
{% load menu %}
{% nb_menu request %}
中间件权限设置
def process_view(self, request, callback, callback_args, callback_kwargs):
if self.is_white_url(request):
return
current_name = request.resolver_match.url_name
# 0.是否是公共权限
if current_name in settings.NB_PERMISSION_PUBLIC:
return
# 1.根据用户角色获取自己具备所有的权限
user_permission_dict = settings.NB_PERMISSION[request.nb_user.row]
# 2.获取当前用户访问的URL
current_name = request.resolver_match.url_name
print(current_name)
# 3.判断是否在自己具备的权限
if current_name not in user_permission_dict:
return HttpResponse("无权访问")
# 4.有权限 就设置路径显示
text_list = []
text_list.append(user_permission_dict[current_name]["text"])
# 5.有权限的路径导航
menu_name = current_name
while user_permission_dict[current_name]['parent']:
menu_name = user_permission_dict[menu_name]['parent']
text = user_permission_dict[menu_name]['text']
text_list.append(text)
text_list.append("首页")
text_list.reverse()
# 4.1 当前菜单的值
request.nb_user.menu_name = menu_name
# 4.2 路径导航
request.nb_user.text_list = text_list
print(text_list)
html 要写的路径代码
<ol class="breadcrumb">
{% for text in request.nb_user.text_list %}
<li><a>{{ text }}</a></li>
{% endfor %}
</ol>
云服务器linx
pwd 查看目录
git 查看是否下载git
yum install git 下载git
git clone http://gitee.com/baixue888/order.git 上传
ls 查看是否order文件夹
cd order/ 进入目录
ls 查看文件内容
如果有修改git仓库代码 执行 git pull origin master
在git bash操作
rm -rf order/ 在linx删除文件夹
git remote -v 查看git 远程源地址
git remote rm origin 删除所有远程地址
insert into mysql.user(user,host,password) values('baixuejie','%',password('baixuejie123!'));
标签:name,views,django,Note,Book,user,path,login From: https://www.cnblogs.com/bxj123/p/17881106.html