(文章里的链接不是我写的,都是引用别人的,我只是记录查看)

编辑器:vscode

语言:python

后端:django

前端:vue

前后端分离

一、项目框架搭建

https://blog.csdn.net/weixin_58546893/article/details/124092802

这个博客是Python Web 环境搭建,写的很详细,适合小白(我,小白)。

(1)https://blog.csdn.net/Diana003/article/details/122744127

(2)https://blog.csdn.net/somenzz/article/details/100815458?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167177645716800188599496%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167177645716800188599496&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-100815458-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_esquery_v1&utm_term=python%20django%20vue%20%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB%20%E6%95%B0%E6%8D%AE%E8%81%94%E8%B0%83&spm=1018.2226.3001.4187

(3)https://blog.csdn.net/mxsgoden/article/details/116307448

这几个我是一起看的,写的是前后端分离项目的创建,还有数据联调(跨域),但是小白可以先不把前端项目打包(当然,这只是建议)。

因为我就这样干了,后面想在后端一个视图类中设置session数据,然后在另一个视图类里获取前面设置的session数据,获取的数据总是None,百度了好久都没有百度出来原因。

其中一个文章 https://uoften.com/article/186856.html (我记得刚查看的不是这个链接,是在CSDN 里的一个博客,需要¥) 说是 mock.js 这个东西的原因,我后面也给搞掉了,但还是不行。(这是我的问答,还没结题,希望能够有大佬帮助 http://t.csdn.cn/64fpI)

不知道不先打包会不会像我这样遇到这个情况,所以我上面只是建议,不听也可以的。

到这里项目框架就搭好了

vue 目录

django 目录

二、内容填充

vue 中的main.js文件

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'import axios from 'axios'
//全局设置
Vue.prototype.$axios=axios// 跨域前端请求携带cookie
axios.defaults.withCredentials=true // require('./mock')Vue.use(ElementUI)Vue.config.productionTip = false/* eslint-disable no-new */
new Vue({el: '#app',router,components: { App },template: '<App/>'
})

vue components文件夹中的一个 Login.vue 文件

<template><div class="login"><div class="mylogin" align="center"><h4>登录</h4><el-form :model="loginForm" :rules="loginRules" ref="loginForm" label-width="0px"><el-form-item label="" prop="account" style="margin-top: 10px"><el-row><el-col :span="2"><span class="el-icon-s-custom"></span></el-col><el-col :span="22"><el-input class="inps" placeholder="账号" v-model="loginForm.account"></el-input></el-col></el-row></el-form-item><el-form-item label="" prop="passWord"><el-row><el-col :span="2"><span class="el-icon-lock"></span></el-col><el-col :span="22"><el-input class="inps" type="password" placeholder="密码"v-model="loginForm.passWord"></el-input></el-col></el-row></el-form-item><el-form-item style="margin-top: 55px"><el-button type="primary" round class="submitBtn" @click="submitForm">登录</el-button></el-form-item><div class="unlogin"><router-link :to="{ path: '/forgetpwd' }"> 忘记密码? </router-link>|<router-link :to="{ path: '/register' }"><a href="Register.vue" target="_blank" align="right">注册新账号</a></router-link></div></el-form></div></div>
</template><script>import { mapMutations } from "vuex";// import axios from 'axios'import router from '@/router'import Qs from 'qs'export default {name: "Login",data: function () {return {loginForm: {account: "",passWord: "",},loginRules: {account: [{ required: true, message: "请输入账号", trigger: "blur" }],passWord: [{ required: true, message: "请输入密码", trigger: "blur" }],},};},methods: {// ...mapMutations(["changeLogin"]),submitForm() {const userAccount = this.loginForm.account;const userPassword = this.loginForm.passWord;if (!userAccount) {return this.$message({type: "error",message: "账号不能为空!",});}if (!userPassword) {return this.$message({type: "error",message: "密码不能为空!",});}// axios({this.$axios({method: 'post',// url: 'http://127.0.0.1:8000/user/login/',// url: 'http://127.0.0.1:8000/authlogin/',url: 'http://127.0.0.1:8000/UserInfo/userinfolog/',data: {account: userAccount,password: userPassword},transformRequest: [function (data) {return Qs.stringify(data)}],// withCredentials:true}).then(res => {const { result, detail, errorInfo } = res.data;if (result == true) {// 登录成功// 设置tokenlocalStorage.setItem('token', detail.token);console.log("localStorage")// sessionStorage.setItem('username',userAccount)// 跳转页面router.push('/message');} else {this.$message({showClose: true,message: errorInfo,type: 'error'});}// this.results = JSON.stringify(res.data);// console.log(res.data);// if ("0000" == res.data.code) {//     return this.$message({//         type: "error",//         message: "查无此人,请注册!",//     })// } else if ("0001" == res.data.code) {//     return this.$message({//         type: "error",//         message: "密码错误!",//     })// } else if ("1111" == res.data.code) {//     router.push('/message')//     return this.$message({//         message: "suc",//     })// }}).catch(res => {alert('wrong');})},},};
</script><style>.login {width: 100vw;padding: 0;margin: 0;height: 100vh;font-size: 16px;background-position: left top;background-color: #242645;color: #fff;font-family: "Source Sans Pro";position: relative;}.mylogin {width: 240px;height: 280px;position: absolute;top: 0;left: 0;right: 0;bottom: 0;margin: auto;padding: 50px 40px 40px 40px;box-shadow: -15px 15px 15px rgba(6, 17, 47, 0.7);opacity: 1;background: linear-gradient(230deg,rgba(53, 57, 74, 0) 0%,rgb(0, 0, 0) 100%);}.inps input {border: none;color: #fff;background-color: transparent;font-size: 12px;}.submitBtn {background-color: transparent;color: #39f;width: 200px;}
</style>

django messageBoard文件夹里的 settings.py文件

"""
Django settings for messageBoard project.Generated by 'django-admin startproject' using Django 4.1.3.For more information on this file, see
https://docs.djangoproject.com/en/4.1/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.1/ref/settings/
"""from pathlib import Path####
import os# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-y_ios2r)msu7+$5vy1(tv(wulbhi1dy9uxgg^pb+xn_^ir74un'# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True  ALLOWED_HOSTS = []# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',###我们的app'messageApp','rest_framework',  #后端设置api'rest_framework.authtoken', #token'corsheaders', #跨域]SESSION_ENGING='django.contrib.sessions.backends.cache' #session MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','corsheaders.middleware.CorsMiddleware',#跨域'django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',]ROOT_URLCONF = 'messageBoard.urls'CORS_ORIGIN_ALLOW_ALL = True #跨域
CORS_ALLOW_CREDENTIALS = True #跨域#这个有时候加上前端报错,不加它也没事
# CORS_ALLOW_HEADERS = ('Accept,Authorization,DNT,Content-Type,Referer,User-Agent')CORS_ORIGIN_WHITELIST = ('http://127.0.0.1:8080','http://localhost:8080', #凡是出现在白名单中的域名,都可以访问后端接口
)TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],# 'DIRS':['appvue/dist'], # vue 打包'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]WSGI_APPLICATION = 'messageBoard.wsgi.application'# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databasesDATABASES = {'default': {# 'ENGINE': 'django.db.backends.sqlite3',# 'NAME': BASE_DIR / 'db.sqlite3',
#你可以下载Navicat 数据库可视化工具 , 也可以在VSCode 里下载 插件(忘记是什么了,自己百度吧)'ENGINE': 'django.db.backends.mysql', #声明连接数据库'NAME':  'messageBoard', #数据库名'USER':'root','PASSWORD':'root','HOST':'127.0.0.1','PORT':3306,'CHARSET':'utf8'}
}# Password validation
# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},
]# Internationalization
# https://docs.djangoproject.com/en/4.1/topics/i18n/LANGUAGE_CODE = 'en-us'TIME_ZONE = 'UTC'USE_I18N = TrueUSE_TZ = True# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.1/howto/static-files/STATIC_URL = 'static/'# Default primary key field type
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-fieldDEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'###  vue  npm run build 打包
# STATICFILES_DIRS=[
#     os.path.join(BASE_DIR,"appvue/dist/static"),
# ]REST_FRAMEWORK = {#DEFAULT_PERMISSION_CLASSES是关于用户的权限配置,如果没有配置该项的话就是允许用户无限制访问,不管我们的请求是  被认证或未认证401的。# 'DEFAULT_PERMISSION_CLASSES': (#     'rest_framework.permissions.IsAuthenticated',# ),'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.TokenAuthentication',  # token认证)
}#settings.py 覆盖原来的('django.contrib.auth.backends.ModelBackend',)
#可以重写  authenticate 方法
# AUTHENTICATION_BACKENDS=(
#     "messageApp.views.CustomBackend",
# )#表示哪张表继承了auth_user表(在给auth_user添加字段用到)
AUTH_USER_MODEL="messageApp.UserInfo"

django ->messageBoard->_init_.py

###
import pymysql
pymysql.install_as_MySQLdb()

这个在设置数据库上用到。

django->messageApp->models.py

from django.db import models#https://www.bbsmax.com/A/kPzOnXe8dx/
# Create your models here.
#类 对应数据库表
class Sangfor(models.Model):name = models.CharField(max_length=30)author = models.CharField(max_length=30, blank=True, null=True)class Login(models.Model):name = models.CharField(max_length=20, blank=True, null=True)passwd = models.CharField(max_length=20, blank=True, null=True)class User(models.Model):username = models.CharField('用户名',max_length=20, blank=True, null=True)password = models.CharField('密码',max_length=20, blank=True, null=True)createtime=models.DateField('创建时间',auto_now=True)def __str__(self):return self.usernameclass Message(models.Model):username=models.ForeignKey('User',verbose_name='用户名',on_delete=models.CASCADE)context=models.CharField('留言内容',max_length=50, blank=True, null=True)from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):createtime=models.DateField('创建时间',auto_now=True)# class Meta(AbstractUser.Meta):#     swappable = "AUTH_USER_MODEL"class MessageInfo(models.Model):username=models.ForeignKey('UserInfo',verbose_name='用户名',on_delete=models.CASCADE)context=models.CharField('留言内容',max_length=50, blank=True, null=True)createtime=models.DateField('创建时间',auto_now=True)

django->messageApp->serializer.py

# 针对models设计和声明序列化类from rest_framework import serializersfrom messageApp.models import Sangfor,Login,User,Message,UserInfo,MessageInfo#https://www.django-rest-framework.org/tutorial/quickstart/
#https://blog.csdn.net/hqs2212586/article/details/100571645class SangforSerializer(serializers.ModelSerializer):class Meta:model = Sangforfields = '__all__'class LoginSerializer(serializers.ModelSerializer):class Meta:model = Loginfields = '__all__'   class UserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = '__all__'class MessageSerializer(serializers.ModelSerializer):class Meta:model = Messagefields = '__all__'from django.contrib.auth.models import AbstractUser
class UserInfoSerializer(serializers.ModelSerializer):class Meta:model = UserInfofields = '__all__'class MessageInfoSerializer(serializers.ModelSerializer):class Meta:model = MessageInfofields = '__all__'     

django->messageApp->views.py

from django.shortcuts import render
from django.http import  JsonResponse,HttpResponse# Create your views here.
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import actionfrom messageApp.models import Sangfor,Login,User,Message,UserInfo,MessageInfo
from messageApp.serializer import SangforSerializer,LoginSerializer,UserSerializer,MessageSerializer,UserInfoSerializer,MessageInfoSerializerfrom messageApp.constant import codefrom django.views.decorators.csrf import csrf_exempt,csrf_protectfrom django.contrib import auth
from rest_framework.authtoken.models import Tokenfrom rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.permissions import AllowAny
from django.contrib.auth.models import User as authUser# user/views.py
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
class CustomBackend(ModelBackend):def authenticate(self, request=None, username=None, password=None, **kwargs):try:user = User.objects.get(Q(username=username))if user.password==password:return userexcept Exception as e:return e########################
#使用原始的auth_user
# https://juejin.cn/post/6874872436962099208/@api_view(['POST'])
@permission_classes((AllowAny,))
@authentication_classes(())
def authlogin(request):"""登录"""result = TrueerrorInfo = u''detail = {}username=request.POST.get('account')password=request.POST.get('password')# 调用django进行用户认证 # 验证成功 user返回<class 'django.contrib.auth.models.User'># 验证失败 user返回Noneuser = auth.authenticate(username=username, password=password)print ("user",user)if user == None:result = FalseerrorInfo = u'用户名或密码错误'return Response({"result": result, "detail": detail, "errorInfo": errorInfo})# 用户名和密码验证成功# 获取用户的token 如果没有token ,表示时用户首次登录,则进行创建,并且返回tokentry:tokenObj = Token.objects.get(user_id=user.id)except Exception as e:# token 不存在 说明是首次登录tokenObj = Token.objects.create(user=user)# 获取token字符串token = tokenObj.keyrequest.session["username"]=usernamereturn Response({"result": result, "detail": {'token': token}, "errorInfo": errorInfo})@api_view(['POST'])
@permission_classes((AllowAny,))
# @authentication_classes(())
def register(request):"""注册"""result = TrueerrorInfo = u'注册成功'detail = {}username=request.POST.get('account')password=request.POST.get('password')try:authUser.objects.create_user(email='',username=username,password=password) except Exception as e:print(e)result = FalseerrorInfo = u'账号重复'return Response({"result": result, "detail":detail, "errorInfo": errorInfo})else:return Response({"result": result, "detail":detail, "errorInfo": errorInfo})
#####################################################
#继承auth_user 自定义 User
# https://blog.csdn.net/weixin_46765649/article/details/126511725
# https://blog.csdn.net/weixin_44217936/article/details/123695565from django.contrib.auth import loginclass UserInfoViewSet(viewsets.ModelViewSet):queryset = UserInfo.objects.all()# serializer_class = UserInfoSerializer@action(methods=['post'],detail=False,url_path='userinfolog')#刚开始的401 未认证,可以先创建超级管理员@permission_classes((AllowAny,))@authentication_classes(())def user_login(self,request):result = TrueerrorInfo = u''detail = {}username=request.POST.get('account')password=request.POST.get('password')user = auth.authenticate(username=username, password=password)print ("user",user)if user == None:result = FalseerrorInfo = u'用户名或密码错误'return Response({"result": result, "detail": detail, "errorInfo": errorInfo})      try:tokenObj = Token.objects.get(user_id=user.id)except Exception as e:tokenObj = Token.objects.create(user=user)token = tokenObj.key#from django.contrib.auth import login    存入session#设置过期时间# request.session.set_expiry(60*2)# login(request,user)return Response({"result": result, "detail": {'token': token}, "errorInfo": errorInfo})@action(methods=['post'],detail=False,url_path='userinforeg') @permission_classes((AllowAny,))def userinfo_register(self,request):result = TrueerrorInfo = u'注册成功'detail = {}username=request.POST.get('account')password=request.POST.get('password')try:UserInfo.objects.create_user(email='',username=username,password=password) except Exception as e:print(e)result = FalseerrorInfo = u'账号重复'return Response({"result": result, "detail":detail, "errorInfo": errorInfo})return Response({"result": result, "detail":detail, "errorInfo": errorInfo})class MessageInfoViewSet(viewsets.ModelViewSet):queryset = MessageInfo.objects.all()serializer_class = MessageInfoSerializer@action(methods=['post'],detail=False,url_path='submitMessage')def submitMessage(self,request):result = TrueerrorInfo = u'留言成功'detail = []context=request.POST.get('message')userInfo=request.usermessage=MessageInfo(username=userInfo,context=context)message.save()return Response({"result": result, "detail":detail, "errorInfo": errorInfo})@action(methods=['get'],detail=False,url_path='getMessages')def getMessages(self,request):result = TrueerrorInfo = u''detail = []       messages=MessageInfo.objects.all()for message in messages:detail.append({'context':message.context,'username':str(message.username),'createtime':message.createtime})return Response({"result": result, "detail":detail, "errorInfo": errorInfo})############################class UserViewSet(viewsets.ModelViewSet):queryset = User.objects.all()serializer_class = UserSerializer@action(methods=['post'],detail=False,url_path='login')def user_login(self,request):username=request.POST.get('account')password=request.POST.get('password')# print ("==============================================================")# login_user=auth.authenticate(username=username,password=password)# print ("+++++++++++++++++++++++++++++++++++++++++++++++++")# print (type(login_user))# if login_user == None:#     result = False#     errorInfo = u'用户名或密码错误'#     return Response(code.FAIL)# # 用户名和密码验证成功# # 获取用户的token 如果没有token ,表示用户首次登录,则进行创建,并且返回token# try:#     print(1)#     tokenObj = Token.objects.get(user_id=login_user.id)#     print(2)# except Exception as e:#     # token 不存在 说明是首次登录#     print(3)# tokenObj = Token.objects.create(user=login_user)# ValueError: Cannot assign "<User: 123>": "Token.user" must be a "User" instance.#     Token.user#     print(4)# # 获取token字符串# token = tokenObj.key# return Response({"result": result, "detail": {'token': token}, "errorInfo": errorInfo})try:user=User.objects.get(username=username)except Exception as e:print(e)return JsonResponse(code.FAIL, safe=False)else:if password == user.password:request.session["username"]=usernamereturn JsonResponse(code.SUCCESS, safe=False)else:return JsonResponse(code.PASSWORD_ERR, safe=False)@action(methods=['post'],detail=False,url_path='register') def user_register(self,request):username=request.POST.get('account')password=request.POST.get('password')ss=request.session.get("username")print(ss)try:user=User.objects.get(username=username)except Exception as e:user=User(username=username,password=password)user.save()return JsonResponse(code.SUCCESS, safe=False)else:return JsonResponse(code.FAIL, safe=False)class MessageViewSet(viewsets.ModelViewSet):queryset = Message.objects.all()serializer_class = MessageSerializer@action(methods=['post'],detail=False,url_path='submitMessage')def submitMessage(self,request):username=request.session.get("username")context=request.POST.get('message')print(request.session)print(context)user=User.objects.get(username='123')message=Message(username=user,context=context)message.save()return JsonResponse(context, safe=False)@action(methods=['get'],detail=False,url_path='getMessages')def getMessages(self,request):messageList=[]messages=Message.objects.all()for message in messages:messageList.append({'context':message.context,'username':str(message.username)})return JsonResponse(messageList, safe=False)class SangforViewSet(viewsets.ModelViewSet):queryset = Sangfor.objects.all()serializer_class = SangforSerializerclass LoginViewSet(viewsets.ModelViewSet):#http://127.0.0.1:8000/login/2/  retrieve#http://127.0.0.1:8000/login/    listqueryset = Login.objects.all()serializer_class = LoginSerializer#http://127.0.0.1:8000/login/useraction/@action(methods=['get','post'],detail=False,url_path='useraction')def user_action(self,request,*args,**kwargs):dd={"w":"www","ee":"tttt"}return Response(dd)

django->messageBoard->urls.py

"""messageBoard URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views1. Add an import:  from my_app import views2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views1. Add an import:  from other_app.views import Home2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path,include
from rest_framework.routers import DefaultRouterfrom messageApp import views###
from django.views.generic.base import TemplateViewfrom rest_framework import routersrouter = DefaultRouter()
# router.register('sangfor', views.SangforViewSet)
router.register('login', views.LoginViewSet)
router.register('user', views.UserViewSet)
router.register('message', views.MessageViewSet)
router.register('UserInfo', views.UserInfoViewSet)
router.register('MessageInfo', views.MessageInfoViewSet)urlpatterns = [path('authlogin/',views.authlogin,name='authlogin'),path('authreg/',views.register,name='authreg')# path('admin/', admin.site.urls),# path(r'',TemplateView.as_view(template_name="index.html")) #前端打包 rnpm run build# path('retrieve',views.LoginViewSet.as_view({'get':'retrieve'})), # http://127.0.0.1:8000/retrieve  suc
]urlpatterns+=router.urls

大致代码都在这了,没涉及到的就自己补全吧。

三、同步数据库

在django 终端中写入这两句命令:

python manage.py makemigrations

python manage.py migrate

【插入补充:】

python web

(1)django

django-admin startproject welcome

cd welcome

python manage.py startapp firstApp

创建项目: https://blog.csdn.net/weixin_58546893/article/details/124092802

登录注册案例:https://www.cnblogs.com/bloglogs/p/16223976.html

(2)连接数据库 mySQL

项目目录下的settings.py 设置数据库连接信息 ,

DATABASES = {

'default': {

# 'ENGINE': 'django.db.backends.sqlite3',

# 'NAME': BASE_DIR / 'db.sqlite3',

'ENGINE': 'django.db.backends.mysql', #声明连接数据库

'NAME': 'xxxx', #数据库名

'USER':'root',

'PASSWORD':'xxxxx',

'HOST':'127.0.0.1',

'PORT':3306,

'CHARSET':'utf8'

}

}

然后在 _init_.py 文件中写

import pymysql

pymysql.install_as_MySQLdb()

(3)这一步要成功在App中的migrations文件夹中出现 001——initial.py文件

python manage.py makemigrations # 将操作记录记录到小本本上(migrations文件夹)

python manage.py migrate # 将操作真正的同步到数据库中

(4)可能出现的错误:

错误:No changes detected

再写成这样: python manage.py makemigrations first

错误:Running migrations: No migrations to apply.

看这个博客:https://blog.csdn.net/weixin_43996959/article/details/103091067

错误: Migration admin.0001_initial is applied before its dependency messageApp.0001_initial on database 'default'.

看这个博客:https://blog.csdn.net/qq_39177678/article/details/123666659

(5)设置 session https://www.zhihu.com/question/570889880

# python django sessions

SESSION_ENGING='django.contrib.sessions.backends.cache'

# SESSION_FILE_PATH='/file_session'

request.session['username']=userName

userName=request.session.get('username')

(6)flask https://blog.csdn.net/weixin_52694360/article/details/127146952

四.启动项目

vue:npm run dev

django: pip manage.py runserver

python django vue +VSCode 前后端分离相关推荐

  1. python+django+vue搭建前后端分离项目Part1

    文章目录 Python环境搭建 安装django框架 创建django项目 新建static静态文件夹 创建django App(后端) 创建vue项目(前端) 集成vue项目到django 打包vu ...

  2. python+Django+vue 搭建前后端分离项目

    步骤一 : 创建项目所在文件夹. 步骤二: 进入CMD模式输入 : django-admin startproject backend 步骤三 : 进入backend 步骤四:查看Django后端服务 ...

  3. python+django+vue搭建前后端分离项目Part3——后端django

    文章目录 创建django项目 数据库创建和连接 创建 Django APP 后端搭建 模型层model.py 视图层view.py 路由配置 数据迁移 参考文章 创建django项目 (my_dja ...

  4. python+django+vue搭建前后端分离项目Part2——前端Vue

    文章目录 创建vue项目 主要文件及其作用 src/components/ src/router/index.js src/main.js static/ 创建vue项目 (my_django) XX ...

  5. Django+Vue,前后端分离,实现用户权限认证

    网上教程一大堆,要么思路不够清晰,要么给你扔一大段代码,只有几行注释.... 看了我这个,你奶奶来都能实现前后端分离用户权限认证! Django 采用token认证方式,使用 rest_framewo ...

  6. Django vue 搭建前后端分离的web 二

    bootstrap的安装和使用: 安装: 在vue项目下使用npm直接安装即可: 由于bootstrap依赖jQuery,所以第一步安装jQuery: npm install jquery 检查在pa ...

  7. 从零到一 django + vue 构建前后端分离项目

    (本文在win10环境下进行) django 和 vue 的优点 django的python血统,开发起来基本上是站在巨人的肩膀上,用起来顺手,加上drf这个restful API 框架,SaltSt ...

  8. Django vue 搭建前后端分离的web 三

    Django连接数据库(MySQL) : 第一步:使用命令[pip install mysqlclient ],可以下载并安装最新版本的mysqlclient 第二步:创建数据库:create dat ...

  9. 记一次Spring boot 和Vue的前后端分离的入门培训

    记一次Spring boot 和Vue的前后端分离的入门培训 由于公司之前是写C#的,现在要转 Java分布式 + vue,所以进行一次前后端的简单培训. 前端工具和环境: Node.js V10.1 ...

最新文章

  1. pytest中pytest_addoption用法 动态添加命令行参数 (钩子函数)
  2. ajax 下拉框 保留,Ajax生成select级联下拉框和清空多余选项
  3. html获取url上的参数
  4. 航海学校高级课程任务讲义--海事课程
  5. 山体等高线怎么看_每日一题 | 此处向斜山,你看出来了吗?
  6. 958. 二叉树的完全性检验 golang
  7. 锁表的进程和语句,并杀掉
  8. 大数据时代,怎么做全渠道的营销
  9. Bitmap添加文字水印
  10. linux源码文件名,Linux中文件名解析处理源码分析
  11. 基于JAVA+Spring+MYSQL的美食网站系统
  12. 如何在SQL Server中使用级联删除?
  13. CF1033A. King Escape的题解
  14. Java经典设计模式(1):五大创建型模式(附实例和详解)
  15. 中国羽绒服市场深度调查研究报告
  16. JT/T-1078流媒体服务优化升级
  17. 如何成为高手?嵌入式开发进阶之路...
  18. 有一根27厘米的细木杆java_[转载]推荐最近看过的最好的java视频
  19. NYOJ54 小明的存钱计划
  20. html模拟点击某个键盘按钮,如何使用JavaScript模拟按键或单击?

热门文章

  1. 如何优雅获取B站壁纸?
  2. 真随机数和伪随机数以及伪随机数的MATLAB实现
  3. 《新一代视频压缩编码标准H.264》
  4. C++ 多线程:std::future
  5. 海奥华预言--译文前言
  6. 程序员:凭自己能力吃饭,有什么理由瞧不起?
  7. linux防火墙禁用traceroute,raw socket traceroute权限拒绝处理
  8. 欢聚时代软件测试校招面经
  9. Java Guava工具类的使用
  10. [每日一氵] [软件] premiere 视频片段如何在时间线上微调