pip换源
1 pip3 install 模块 # 去国外下,比较慢
2 pip3 install -i 国内源(豆瓣,清华)模块 # 快一些,但是每次都要加 -i
3 在pycharm中配置
4 在机器上,永久配置
文件管理器文件路径地址栏敲:%APPDATA% 回车,快速进入 C:\Users\电脑用户\AppData\Roaming 文件夹中
-C:\Users\你电脑的用户名\AppData\Roaming
-新建文件夹pip
-在文件夹下新建 pip.ini 配置文件
新增 pip.ini 配置文件内容
[global]
index-url = http://pypi.douban.com/simple
[install]
use-mirrors =true
mirrors =http://pypi.douban.com/simple/
trusted-host =pypi.douban.com
-以后再装模块,就会走豆瓣源
虚拟环境搭建
1 两个项目,一个依赖了1.11.9,另一个依赖了2.2.2
2 虚拟环境的出现是为了解决多个项目依赖版本不同的问题
3 如何搭建:
:> pip3 install virtualenv # 创建虚拟环境的模块
# 有了虚拟环境以后可以快速的在不同环境间进行切换
:> pip3 install virtualenvwrapper-win # 只针对于window,
:> pip3 install virtualenvwrapper # 只针对于linux
4 虚拟环境的创建路径
-环境变量中新增一个key:value
-WORKON_HOME: D:\Virtualenvs
-确认好scripts路径下有bat批处理文件
-linux确认好scripts路径下有sh批处理文件
4 开始创建虚拟环境(在cmd执行)
:> mkvirtualenv -p python3 虚拟环境名称
:> mkvirtualenv python 虚拟环境名称
-退出虚拟环境
:> deactivate
-进入虚拟环境
:> workon # 列出所有虚拟环境
:> workon luffy
项目创建,目录调整
# 项目创建,指定新建的虚拟环境
# 进行目录调整,把app统一放到某个路径下:luffapi下的apps(拖过去)
-配置文件中
-path=os.path.join(BASE_DIR,'luffyapi','apps')
-sys.path.append(path)
# 后期创建app的时候,需要先切到apps路径下
python ../../manage.py startapp order
# 两套配置文件(一套是开发环境,一套是上线环境)
-再项目路径下创建了一个setting文件夹,新建了
-dev.py # 开发用这个配置
-pro.py # 上线用这个配置
-坑:BASE_DIR变成了 以后BASE_DIR是luffyapi下的小luffyapi
-需要改:path=os.path.join(BASE_DIR,'apps')
# 如果使用python manage.py runserver 能正常运行,需要修改manage.py中
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.dev')
"""
├─ luffyapi
├─logs/ # 项目运行时/开发时日志目录 - 包
├─ manage.py # 脚本文件
├─ luffyapi/ # 项目主应用,开发时的代码保存 - 包
├─ apps/ # 开发者的代码保存目录,以模块[子应用]为目录保存 - 包
├─ libs/ # 第三方类库的保存目录[第三方组件、模块] - 包
├─ settings/ # 配置目录 - 包
├─ dev.py # 项目开发时的本地配置
└─ pro.py # 项目上线时的运行配置
├─ urls.py # 总路由
└─ utils/ # 多个模块[子应用]的公共函数类库[自己开发的组件]
└─ scripts/ # 保存项目运营时的脚本文件 - 文件夹
"""
# 整个项目的启动是依据配置文件启动
# 如果把某个路径加入了环境变量
# 再导入包,直接从环境变量开始导起
项目生成requirements.txt
1 项目的依赖,以后标准,每个项目都必须有,包括脚本项目
2 直接手写requirements.txt,放在项目根路径下
3 自动生成
:> pip3 freeze >requirements.txt
后台本地化配置
# 在配置文件中改
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
数据库配置
1 使用mysql数据库,建一个库,给开发人员分配一个开发用户
2 创建luffy库
-使用navicate创建库
-使用命令
-create database luffy default charset=utf8;
3 创建用户,授予权限
-查看有那些用户
select user,host,password from mysql.user;
-创建luffy用户,授予luffy库的所有权限
# 授权账号命令:grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'
grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
flush privileges;
4 django配置
-在配置文件中配置
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffy',
'USER': 'luffy',
'PASSWORD': 'Luffy123?',
'HOST': 'localhost',
'PORT': 3306
}
-密码容易被人看到(写到环境变量中)
password=os.getenv('db_password','Luffy123?')
print(password)
DATABASES = {
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffy',
'USER': 'luffy',
'PASSWORD': password,
'HOST': 'localhost',
'PORT': 3306
}
}
5 安装pymysql,或者是mysqlclient
-运气好:一把装好就用mysqlclient
-pip3 install mysqlclient
-或者使用pymysql(django版本超过2.0.7,需要改源码)
-在配置文件中加入
import pymysql
pymysql.install_as_MySQLdb()
后端项目建好,调整好,写一个多方式登录接口
models.py
from django.db import models
class UserInfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
phone = models.BigIntegerField()
email = models.EmailField()
serializer.py
from user import models
from rest_framework import serializers
import re
from rest_framework.exceptions import ValidationError
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
class UserInfoModelSerializer(serializers.ModelSerializer):
username = serializers.CharField()
class Meta:
model = models.UserInfo
fields = ['username', 'password']
def validate(self, attrs):
username = attrs.get('username')
password = attrs.get('password')
# 多方式登录,username有可能是手机号,邮箱,用户名
if re.match('^1[3-9][0-9]{9}$', username):
# 用手机号登录
user = models.UserInfo.objects.filter(phone=username).first()
elif re.match(r'^.+@.+$', username):
# 以邮箱登录
user = models.UserInfo.objects.filter(email=username).first()
else:
# 以用户名登录
user = models.UserInfo.objects.filter(username=username,password=password).first()
if user:
# 登录成,签发token
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
self.context['token'] = token
self.context['username'] = user.username
return attrs
else:
# 校验不通过
raise ValidationError('用户名或密码错误')
views.py
from django.shortcuts import render
from rest_framework.generics import CreateAPIView
from user import models
from user import serializer
from rest_framework.response import Response
from rest_framework.viewsets import ViewSetMixin
# class UserLogin(CreateAPIView): # 需要自己配路径
class UserLogin(ViewSetMixin, CreateAPIView): # 自动生成路由
queryset = models.UserInfo.objects.all()
serializer_class = serializer.UserInfoModelSerializer
def create(self, request, *args, **kwargs):
# context是上下文,是视图类和序列化类沟通的桥梁
ser = self.get_serializer(data=request.data)
if ser.is_valid():
token = ser.context['token']
username = ser.context['username']
print(username)
return Response({'status': 100, 'msg': '登录成功', 'token': token, 'username': username})
else:
print(ser.errors)
return Response({'status': 101, 'msg': '用户名或密码错误'})
urls.py
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import SimpleRouter
from user import views
router = SimpleRouter()
router.register('login', views.UserLogin)
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include(router.urls)),
]