关于django+vue工程部署到服务器上遇到的问题

一、前台有错误,前台请求后台接收不到

由于之前一直是在本地运行调试网站,前台请求后台都是http://localhost:8000/api/这样类似的,也一直没有问题,等到部署到服务器上时就卡主了,后来发现得把localhost换成当前ip,貌似可以用window.location.host来获取主机ip

二、前台正确的情况下,网站后台接收不到请求

一般是服务器没运行起来,但我可能比较特别,我一直使用python3 manage.py runserver 127.0.0.1:8000 在服务器上启动后台,然后根本接收不到请求,百度了半天,一个个解决方案去试,后来发现应该用python3 manage.py runserver 0.0.0.0:8000,这个127.0.0.1,和0.0.0.0广播地址有点搞不明白为什么,之后有时间再来百度理解一下,为什么

三、前台axios请求等待返回值后再执行

前面加个await就可以了,这次找bug感觉对前后台请求更为了解了,下次碰到前台发请求后台无响应net refused这种,在服务器上估计就是地址错了,或者服务器没有运行对地址,django如果接受到了get和post请求一定会显示在控制台上,但是如果换成java,下次查查有没有日志显示get和post请求历史日志

python相对路径

f=open(‘test.txt’),明明test.txt就在代码文件旁边,还是说no such file ,发现是默认在上层,也就是要改成./taple_label/label/test.txt,django框架的坑?还是python的坑呢,之后回头再看看吧

Navicat Premium 15 用注册机注册的时候 报错 rsa public key not find

文件下载链接

链接:https://pan.baidu.com/s/1tshmdC5N7FcdDEsVwVRL5g
提取码:2333

安装文件和注册机准备好后,全程断开网络,如果失败了就卸载重装再来一次,基本上能百分百成功

第一步先不要打开 Navicat ,先打开注册机

第二步:点击path 找到你的Navicat启动的exe,安装路径的exe,选中Navicat.exe,点击打开。

第三步:稍等打开后,手动打开 Navicat 软件,进入激活界面后,点击注册机的Generate

第四步: 点击手动注册,然后先点击Copy 再点击 paste ,将那一串代码,输入到 DeFconX 下

第五步点击最后一个按钮,将生成的代码拷贝,输入Navicat 的注册框

关于django数据库迁移命令提示No changes detected

使用python manage.py makemigrations时提示No changes detected

试了很多网上的方法,都没成功,最后自己摸了半天搞出来了

因为是小组同步代码,别人已经生成了数据库成功了,然后push代码到github上,我再下拉,把这个成功的缓存给拉下来了,所以要清除生成数据库成功的缓存

去项目下的migrations本地文件夹下删除缓存文件夹(我这里是_pycache_)

然后还有很关键的一点去本地django库里删除相关缓存(_pycache_),我的路径是这个

E:\Python\Lib\site-packages\django 下的_pycache_

E:\Python\Lib\site-packages\django\apps下的_pycache_

E:\Python\Lib\site-packages\django\core下的_pycache_

E:\Python\Lib\site-packages\django\core\cache下的_pycache_

E:\Python\Lib\site-packages\django\core\serializers下的_pycache_

删完后去navicati删除所有数据库表,可以删库后重建一个同名的库

然后要执行 python manage.py makemigrations \-\-empty appname (这里一般是你的项目名,也就是migrations文件夹的上一层文件夹名,如果没有就要去settings.py里的INSTALLED_APPS注册,例如我的注册名”tuple_label.label”,我的appname就叫label)

这个时候可以通过 python manage.py showmigrations 查看一下migrations里存了什么,确定是否正确,如果有问题,回到最上面重新生成

最后一步 python manage.py migrate 就大功告成啦

如果还有不能解决的,比如生成appname那步有问题的,先试试改下

正则表达式的学习

最近写了一个匹配以什么什么开头,以什么什么结尾的,且字符串长度不超过多少的正则

pattern = re.compile(r’肌酐[\w|:|/|↑|.| |(|)|:|\u4e00-\u9fa5]{,20}L’) #/&;/g [\u4e00-\u9fa5]

(此处为以肌酐开头,以L结尾的匹配)

p.append(pattern)

在学习时,注意到了/g这个用法,能让match函数返回多个值,然后是\.来匹配点

还有没有非某个范围的说法,比如企图用/|\u4e00-\u9fa5]来匹配不是中文的一切东西是不行的

然后是group的用法,这就是个分组

如果正则里面有小括号部分,括起来的就是分组,第一个是分组1,第二个是分组2

例子

import re
pattern = re.compile(‘(\d+).(\d)?’)
s=’肌酐(Cr): 456,187.0μmol/L546.555′
searchObj = re.search(pattern, s, flags=0)
print(searchObj.group(1))

只能匹配某个范围,没有非

了解到 ?* 和 {,20} 从某种程度来说,很像,?*只是一个没有确定值的范围,尽可能少

了解到断言?:

首先,正则表达式的”非”,代表不想匹配某个字符。

比如字符串 helloword123,/[^0-9]+/g 可以匹配非数字,即匹配结果为 helloword;

同样的,/[^he]+/g 可以匹配非h非e的字符,匹配结果为lloword123;

那么 /[^hello]/g 呢?乍一看可能会以为能匹配word123,其实不然,[^] 内的多个字符是”或”的关系存在的,即它们并不是一个整体,/[^hello]/g 表示 非h非e非l非o,并不能理解为 非(hello),所以匹配结果是 w 和 rd123。

道理我们都懂,可我们就是想匹配非某个字符串呢?比如某一字符串若是含有hello则无匹配,若是不含hello则匹配,写成[^hello]是显然不行的,[^(hello)] 呢?其实不起作用。

这时我们需要用到正则表达式的断言——(?!pattern) 零宽负向先行断言 或者 (?<!pattern) 零宽负向后行断言 均可。

这里只介绍一种写法,大家可以都去尝试一下。

/^((?!hello).)+$/

由于断言 (?!hello)是不占位的,后跟的 . 在原位置匹配任意字符,再用括号将其括起来,用+重复一次或多次,前后加上^和$,若是字符串中存在hello,则匹配到h字符之前的时候,断言(?!hello)匹配失败,正则匹配结果为false, 若是字符串中不存在hello,则匹配结果是整个字符串。

用法实战

  1. 匹配&和;之间不含有test的字符

str = “hello&nbsp; &test1;test&qout;”;

正则表达式:/&((?!test).)+;/g

匹配结果:&nbsp;和 &qout;

2.匹配不含有标签的标签

str = “<div id=’1′><img class=’xx’></div><div id=’1′><input type=”text”></div>“;

正则表达式: /<div[^>]*>((?!<img[^>]*>).)+</div>/g

匹配结果:<div id=’1′><input type=”text”></div>

享受学习

坚持做某一件事,热爱是一个不可缺少的原因。这是真正能提供你源源不断的动力的根本所在。做任何事情也是如此,不是为了争名逐利,只是单纯的享受过程,喜欢某件事情本身,这样即便会带来挫败,也不会让你望而却步或者干脆放弃。

HBTCM寒假第一次积分赛

A – HangOver

题目大意就是求1/2+1/3+…+1/n+1的值大于给的数时,n为多少

代码:

#include<iostream>
#include<cstdlib>
using namespace std;

int main(){
    double n,sum;
    int t;
    while(cin>>n){
        if(n==0) break;
        sum=0;
        for(int i=1;i>=-1;i++){
            if(sum>=n) {cout<<t<<" card(s)"<<endl;break;}
            t=i;
           // cout<<1<<"/"<<t+1<<endl;
            sum+=1.0/(t+1)*1.0;
           // cout<<sum<<endl;
        }
    }
    return 0;
}

B – 回文数

HRBUST – 1280 

题目吐槽:此题不需要文件读入读出…..然后是有一个函数itoa可以方便进制转换,可以自己手写,也可以调用,只是不知道为什么老师只给了g++的编译器,而g++编译器恰好只支持atoi不支持itoa,只好手动copy一份百度itoa代码,原itoa在c++中应存在并且头文件为
<stdlib.h>(C++版本:<cstdlib>)

题目理解:进行进制转换

#include<iostream>
#include <string>
#include <string.h>
#include <cstring>
#include <cstdlib>
using namespace std;


bool huiwen(char *s){
    int len=strlen(s);
    for(int i=0;i<len/2;i++){
        if(s[i]==s[len-i-1]) continue;
        return false;
    }
    return true;
}
bool hanshu(int S){
    int i,coun=0;
    char s[10000];
    for(i=2;i<=10;i++){
        itoa(S,s,i);
        if(huiwen(s)) coun++;
        if(coun==2) return true;
    }
    return false;
}

int main(){
    int N,S,coun=0,t;
    while(cin>>N>>S){
        S++;
        cout<<"Case "<<++coun<<":"<<endl;
        for(int i=0;i<N;i++){
            if(!hanshu(S))
                i--;
            else cout<<S<<endl;
            S++;
        }
    }
    return 0;
}

C – 字数统计

HDU – 1735 

#include<iostream>
#include <string>
#include <string.h>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
int s[10000+5][100+5];
int main(){
    int N,L,M,i,j,counM,counD,counO,z,coun;
    int d[10000+5];
    while(cin>>N>>L>>M){
        memset(d,0,sizeof(d));
        counM=counD=counO=0;
        for(i=0;i<N;i++){
            for(j=0;j<L;j++){
                cin>>s[i][j];
                if(s[i][j]==0) counO++;
                if(j==1) {
                    if(s[i][0]==0&&s[i][1]==0) {
                        counM++;
                        if(i!=0){
                            z=L-1;
                            while(s[i-1][z]==0){
                                d[i-1]++;
                                z--;
                            }
                        }
                    }

                }
            }
        }
        z=L-1;
        while(s[i-1][z]==0){
            counO--;
            z--;
        }
        //cout<<counO<<" "<<counM<<endl;
        sort(d,d+N);
        coun=M-1;
        for(i=N-1;i>=N-counM-1;i--){
            if(coun--==0) break;
         //   cout<<d[i];
          //  cout<<d[i]<<endl;
            counO-=d[i];
        }
        cout<<counO-2*M<<endl;
    }



    return 0;
}

D – 最小周长

51Nod – 1283 

#include<iostream>
#include <string>
#include <string.h>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
    int S;
    cin>>S;
    for(int i=(int)sqrt(S);i>=1;i--){
        if(S%i==0) {
           cout<<2*(i+S/i)<<endl;
           break;
        }
    }
    return 0;
}

E – 迷宫城堡

HDU – 1269 

#include<iostream>
#include <string>
#include <string.h>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
const int MAXN=100000;
int vis[MAXN];
int dfn[MAXN];
int low[MAXN];
int c_time;
int flag;
vector<int> mp[MAXN];
void tarjan(int u)//tarjan算法
{
    vis[u]=1;
    low[u]=dfn[u]=c_time++;
    for(int i=0; i<mp[u].size(); i++)
    {
        int v= mp [u][i];
        if(vis[v]==0) tarjan(v);    //如何没访问过
        if(vis[v]==1) low[u]=min(low[u],low[v]);    //如果访问过
    }
    if(dfn[u]==low[u])
        flag++;
}
int main(){
    int n,m,x,y;
    while(cin>>n>>m){
        if(n==0&&m==0) break;
        memset(low,0,sizeof(low));  //初始化
        memset(vis,0,sizeof(vis));
        memset(dfn,0,sizeof(dfn));
        for(int i=1; i<=n; i++) mp[i].clear();
        for(int i=0; i<m; i++)
        {
            cin>>x>>y;
            mp[x].push_back(y);
        }
        c_time=1;
        flag=0;
        for(int i=1; i<=n ; i++)
        {
            if(vis[i] == 0)
            {
                tarjan(i);
            }
        }
        if(flag==1)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}

在补了在补了(