[课程]超细讲解Django打造大型企业官网

课程信息

名称 内容
课程名 超细讲解Django打造大型企业官网
链接 网易云课堂

使用pycharm报错-虚拟环境

1
2
from django.contrib import admin
from django.urls import path

如果代码报引用错误,需要检查pycharm的虚拟环境
可能是新建项目时候自动新建了新的虚拟环境

解决办法

在File->Setting->Python Intepreter中,重新修改下项目的python解释器器
解决结果

新建项目的结构

解决结果

传参数方式其一

/<id>方式

urls.py

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.contrib import admin
from django.urls import path
from django.http import HttpResponse
from book import views

def index(request):
return HttpResponse('index')

urlpatterns = [
path('', index),
path('admin/', admin.site.urls),
path('book/detail/<book_id>', views.book_detail),
]

book>views.py

{6,7}
1
2
3
4
5
6
7
8
from django.http import HttpResponse

def book(request):
return HttpResponse("book")

def book_detail(request, book_id):
text = "图书id是:%s" %book_id
return HttpResponse(text)

settings.py

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book',
]

传参数方式其二

/?id=1方式

urls.py

{7}
1
2
3
4
5
6
7
8
from django.urls import path
from book import views

urlpatterns = [
path('', views.index),
path('book/', views.book),
path('book/detail/', views.book_detail),
]

book>views.py

{10,12}
1
2
3
4
5
6
7
8
9
10
11
12
13

from django.http import HttpResponse

def index(request):
return HttpResponse("index")

def book(request):
return HttpResponse("book")

def book_detail(request):
id = request.GET.get('id')
text = "id:%s" %id
return HttpResponse(text)

settings.py

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book',
]

include函数=>urls模块化

urls.py

1
2
3
4
5
6

from django.urls import path,include

urlpatterns = [
path('book/',include('book.urls') )
]

book>urls.py

1
2
3
4
5
6
7
from django.urls import path
from . import views

urlpatterns = [
path('', views.book),
path('detail/<book_id>', views.book_detail),
]

views.py

1
2
3
4
5
6
7
8
9
10
11
from django.http import HttpResponse

def index(request):
return HttpResponse("index")

def book(request):
return HttpResponse("book")

def book_detail(request,book_id):
text = "id:%s" %book_id
return HttpResponse(text)

macOS 系统下安装mysqlclient报错

报错信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Collecting mysqlclient
Using cached https://files.pythonhosted.org/packages/4d/38/c5f8bac9c50f3042c8f05615f84206f77f03db79781db841898fde1bb284/mysqlclient-1.4.4.tar.gz
Installing collected packages: mysqlclient
Running setup.py install for mysqlclient ... error
ERROR: Command errored out with exit status 1:
command: /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/8t/61_51ylx0w5gl8yw560w88740000gn/T/pip-install-n78rgmem/mysqlclient/setup.py'"'"'; __file__='"'"'/private/var/folders/8t/61_51ylx0w5gl8yw560w88740000gn/T/pip-install-n78rgmem/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/8t/61_51ylx0w5gl8yw560w88740000gn/T/pip-record-9oiumy15/install-record.txt --single-version-externally-managed --compile
cwd: /private/var/folders/8t/61_51ylx0w5gl8yw560w88740000gn/T/pip-install-n78rgmem/mysqlclient/
Complete output (30 lines):
running install
running build
running build_py
creating build
creating build/lib.macosx-10.9-x86_64-3.6
creating build/lib.macosx-10.9-x86_64-3.6/MySQLdb
copying MySQLdb/__init__.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb
copying MySQLdb/_exceptions.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb
copying MySQLdb/compat.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb
copying MySQLdb/connections.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb
copying MySQLdb/converters.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb
copying MySQLdb/cursors.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb
copying MySQLdb/release.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb
copying MySQLdb/times.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb
creating build/lib.macosx-10.9-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/__init__.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/CLIENT.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/CR.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/ER.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/FIELD_TYPE.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/FLAG.py -> build/lib.macosx-10.9-x86_64-3.6/MySQLdb/constants
running build_ext
building 'MySQLdb._mysql' extension
creating build/temp.macosx-10.9-x86_64-3.6
creating build/temp.macosx-10.9-x86_64-3.6/MySQLdb
gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch x86_64 -g -Dversion_info=(1,4,4,'final',0) -D__version__=1.4.4 -I/usr/local/Cellar/mysql-connector-c/6.1.11/include -I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m -c MySQLdb/_mysql.c -o build/temp.macosx-10.9-x86_64-3.6/MySQLdb/_mysql.o
gcc -bundle -undefined dynamic_lookup -arch x86_64 -g build/temp.macosx-10.9-x86_64-3.6/MySQLdb/_mysql.o -L/usr/local/Cellar/mysql-connector-c/6.1.11/lib -lmysqlclient -lssl -lcrypto -o build/lib.macosx-10.9-x86_64-3.6/MySQLdb/_mysql.cpython-36m-darwin.so
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'gcc' failed with exit status 1
----------------------------------------
ERROR: Command errored out with exit status 1: /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/8t/61_51ylx0w5gl8yw560w88740000gn/T/pip-install-n78rgmem/mysqlclient/setup.py'"'"'; __file__='"'"'/private/var/folders/8t/61_51ylx0w5gl8yw560w88740000gn/T/pip-install-n78rgmem/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/8t/61_51ylx0w5gl8yw560w88740000gn/T/pip-record-9oiumy15/install-record.txt --single-version-externally-managed --compile Check the logs for full command output.

网上说法不一,大部分都是解决centos以及乌班图和windows报错,macOS几乎没有,但还是找到了几种:

http://www.cocoachina.com/cms/wap.php?action=article&id=32193
https://github.com/PyMySQL/mysqlclient-python

最终解决方案是通过以下方式安装:

1
LDFLAGS=-L/usr/local/opt/openssl/lib pip3 install mysqlclient

参考解决方案: https://github.com/PyMySQL/mysqlclient-python/issues/131
出处(原创)): https://www.jianshu.com/p/15fcc5a27a81

解决Python用pip命令安装速度慢,改用国内镜像

第一步:(可忽略直接看第二步解决方案)首先我们看一下Python默认用的是哪个地址的镜像:

在命令行输入  pip help install
找出-i, --index-url <url>后面对应的地址就是默认的下载源地址:

第二步:解决方案

Python提供了pip命令,让开发者很容易安装需要的模块。但是,用pip安装时,好多模块默认去外网下载。这样,下载速度就变得灰常缓慢。 这里我们提供一种解决方案。。该镜像的下载地址。
国内的一些站点:
豆瓣:http://pypi.douban.com/simple/
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/

临时使用方法

直接在安装模块的后面加参数:
-i http://pypi.douban.com/simple/

例如:安装web模块django ,我们这里指定用豆瓣。。

pip install django -i http://pypi.douban.com/simple/

永久性使用

window环境

windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini
内容如下:

1
2
3
4
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com

Linux环境

=修改 ~/.pip/pip.conf (没有的话创建一个,那个“.”必须有, 代表的是隐藏文件夹)
内容如下:

1
2
3
4
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com

虚拟环境找不到命令的解决办法macOS下

1.升级python包管理工具pip

1
pip install --upgrade pip

备注:当你想升级一个包的时候 pip install --upgrade 包名

2.python虚拟环境安装

1
2
sudo apt-get install python-virtualenv
sudo easy_install virtualenvwrapper

上述工具装好后找不到mkvirtualenv命令,需要执行以下环境变量设置。

1.创建目录用来存放虚拟环境

mkdir $HOME/.virtualenvs

2.在~/.bashrc中添加行

1
2
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

3.运行

1
source ~/.bashrc

3.创建python虚拟环境

mkvirtualenv [虚拟环境名称]
workon [虚拟环境名称]

4.退出虚拟环境

离开 deactivate

5.删除(慎用)

rmvirtualenv [虚拟环境名称]

输出__str__的两种写法

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.db import models

class Student(models.Model):
name = models.CharField(max_length=224, null=False)
number = models.IntegerField()
teacher = models.ForeignKey('teacher.Teacher', on_delete=models.CASCADE)

class Meta:
db_table = 'student'
verbose_name = '学生表'

def __str__(self):
return "<Student:({id},{name},{number})>".format(id=self.id, name=self.name, number=self.number)
1
2
3
4
5
6
7
8
9
10
11
12
13
from django.db import models


class Teacher(models.Model):
name = models.CharField(max_length=200, verbose_name='老师名字')
number = models.IntegerField()

class Meta:
db_table = 'teacher'
verbose_name = '老师表'

def __str__(self):
return f"<Teacher:({self.id},{self.name},{self.number})>"

python存储文件

1
2
3
4
5
6
7
8
9
class UploadFiles(View):
def post(self, request):
file = request.FILES.get('img')
path = default_storage.save("static/photo/{}/".format(file.name), file)
print(path)
return JsonResponse({
"status_code": 200,
'path': path
})

django实战之gulp自动执行任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var gulp = require("gulp")
var cssnano = require("gulp-cssnano")
var rename = require("gulp-rename")

// 定义一个处理css文件改动的任务
gulp.task("css",function () {
gulp.src("./css/*.css")
.pipe(cssnano())
.pipe(rename({"suffix":".min"}))
.pipe(gulp.dest("./css/dist/"))
.pipe(connect.reload())
});

// 定义一个监听的任务
gulp.task("watch",function () {
// 监听所有的css文件,然后执行css这个任务
gulp.watch("./css/*.css",['css'])
});

以后只要在终端执行gulp watch命令即可自动监听所有的css文件,然后自动执行css的任务,完成相应的工作。

Gulp-更改文件后,自动刷新浏览器

以上我们实现了更改一些css文件后,可以自动执行处理css的任务。但是我们还是需要手动的去刷新浏览器,才能看到修改后的效果。有什么办法能在修改完代码后,自动的刷新浏览器呢。答案是使用gulp-connectgulp-connect安装的命令如下:

1
npm install gulp-connect --save-dev

gulp-connect使用的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var gulp = require("gulp")
var cssnano = require("gulp-cssnano")
var rename = require("gulp-rename")
var connect = require("gulp-connect")

gulp.task("connect",function () {
connect.server({
port: 3000,
root: './',
livereload: true
});
});

// 定义一个处理css文件改动的任务
gulp.task("css",function () {
gulp.src("./css/*.css")
.pipe(cssnano())
.pipe(rename({"suffix":".min"}))
.pipe(gulp.dest("./css/dist/"))
.pipe(connect.reload())
});

// 定义一个监听的任务
gulp.task("watch",function () {
gulp.watch("./css/*.css",['css'])
});

// 执行gulp server开启服务器
gulp.task("server",['connect','watch'])

以上我们创建了一个connect的任务,这个任务会开启一个3000端口,以后我们在访问html页面的时候,就需要通过http://127.0.0.1:3000的方式来访问了。然后接下来我们还定义了一个server任务。这个任务会去执行connectwatch任务,只要修改了css文件,那么就会执行css的任务,然后就会自动刷新浏览器。

python一键安装/导出运行环境到requirements.txt

生成: pip freeze > requirements.txt

导出 pip install -r requirements.txt

django给类设置是否登录验证限制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 注释掉:setting.py
# 'DEFAULT_PERMISSION_CLASSES': (
# 'rest_framework.permissions.IsAuthenticated', # 设置所有接口都需要被验证
# ),

from rest_framework.permissions import IsAuthenticated
# 在请求方法前加:
permission_classes = [IsAuthenticated] #当前类需要验证 IsAdminUser

# 代码如下:
class checkTokenView(APIView):
permission_classes = [IsAuthenticated] #当前类需要验证 IsAdminUser

def get(self, request):
print(request.user)

return Response({
'status': 200
})