pip install django
安装完Django后
创建项目:
django-admin startproject xxx
在setting中换成中文,地区换成上海
zh-hans
Asia/Shanghai
常用manage命令
python3 manage.py runserver ip:port
python3 manage.py startapp xxx
python3 manage.py inspectdb
在setting.py
中将debug = False
改为True
部署前将ALLOWED_HOSTS = []
改为ALLOWED_HOSTS = ['*']
连接 MySQL:
https://www.cnblogs.com/chenxdnote/p/17177058.html
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'stone',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
还需安装mysqlclient
,运行manage.py
时会提示
setting.py
中设置静态文件目录:
STATIC_URL = '/static/'
在每个独立app中可以创建static文件夹单独使用静态文件
setting.py
中设置POST传输大小限制:
DATA_UPLOAD_MAX_MEMORY_SIZE = ?
填字节数,若为None则对大小无限制
记录一种根url中include的一种用法:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('login_signup/', include(('login_signup.urls', 'login_signup'), namespace='login_signup')),
path('', include(('home.urls', 'home'), namespace='home')),
path('others/', include(('others.urls', 'others'), namespace='others')),
path('posts/', include(('posts.urls', 'posts'), namespace='posts')),
path('manage/', include(('backmanage.urls', 'backmanage'), namespace='backmanage')),
path('mystone/', include(('mystone.urls', 'mystone'), namespace='mystone')),
path('fullview/', include(('fullview.urls', 'fullview'), namespace='fullview'))
]
记录一种app中url的写法:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('feedback/', views.feedback, name='feedback'),
path('forum_task/', views.forum_task, name='forum_task'),
path('system_state/', views.system_state, name='system_state'),
path('user_manage/', views.user_manage, name='user_manage'),
path('set_admin/<int:user_id>', views.set_admin, name='set_admin'),
path('remove_admin/<int:user_id>', views.remove_admin, name='remove_admin'),
path('forbid_user/<int:user_id>', views.forbid_user, name='forbid_user'),
path('reset_password/<int:user_id>', views.reset_password, name='reset_password'),
path('remove_post/<int:post_id>', views.remove_post, name='remove_post'),
path('about/', views.about, name='guanyu'),
path('star/<int:feedback_id>', views.star, name='star'),
path('pass_post/<int:post_id>', views.pass_post, name='pass_post'),
path('fail_post/<int:post_id>', views.fail_post, name='fail_post'),
path('advise/', views.advise, name='advise')
]
在每个app中的views.py
中开头自带:
from django.shortcuts import render
在开发过程中根据需要加上redirect
, reverse
redirect中加reverse可带参反向解析重定向
return redirect(reverse('posts:list', kwargs={'page': 1}))
在Django的视图views.py
中,每个视图函数都需要返回一个HttpResponse对象,否则会报错。
因此有时调试时会直接输出数据,可在开头引入HttpResponse
from django.http import HttpResponse
在render语句中第三个参数可传变量到前端,类型为字典。
下为引入本app下models和其他app下的models。
from .models import Posts
from login_signup.models import Users
由于Django对数据库采用的操作是ORM
对models中的对象操作即可对数据库数据进行CURD
对单条数据进行修改示例:
feedback_info = Feedback.objects.get(id=feedback_id)
if feedback_info.star == 0:
feedback_info.star = 1
else:
feedback_info.star = 0
feedback_info.save()
models.py 中的表结构必须和数据库一样,否则会报错
如果数据库中还没有创建本项目的数据库,输入下面两条命令。
python3 manage.py makemigration
python3 manage.py migrate
即可在数据库中按照models中的表结构创建。
若数据库已有表结构,输入命令
python3 manage.py inspectdb
可查看替换到models.py
中的语句,将False改为True 后Django即可对数据进行操作。
res = Posts.objects.all().order_by("-id")
order_by可对数据进行排序
Posts.objects.get()
若没有找到数据会报错
Posts.objects.filter()
函数返回一个列表(即使为空)
在对session进行操作时
request.session.get()
函数在无结果时会报错
在判断后已知存在session情况下使用request.session['??']
直接提取内容
request.session.flush()
可以删除所有session
import time后,·time.time()·返回的是一个带6位小数的时间戳
·str(time.time())[:-8]·可获得切去小数部分的整数时间戳,类型可在外面自行改变
time.localtime(time.time())
返回的是一个time类型对象,有1..类似结构体的感觉。
time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(time.time()))
会返回给出的格式的时间。
封装md5
def md5(strr):
import hashlib
m = hashlib.md5()
m.update(strr.encode("utf8"))
return m.hexdigest()
在操作json数据时,import json
json.loads()
可将json数据转出来
json.dumps()
可转成json数据,只填内容不加参数时,中文会默认转成Unicode字符
第二个参数:ensure_ascii=False
json数据中都用双引号,无单引号。
在写接口时,在不进行任何操作的情况下url必须一模一样才不会跨域。
localhost
和127.0.0.1
也会跨域
而且默认接口url末尾要加上/
修改setting.py
中某条配置就能不加了
带参数的视图函数示例
def list_page(request, page):
对应url示例
path('<int:page>', views.list_page, name='list'),
模板语句中做跳转到带参视图函数也要带参数
在模板中不能对变量进行操作,在视图函数中先操作后传新参
使用模板需要HTML文件的head中加{% load static %}
在静态文件中的CSS文件仍可使用模板语句中的static
{% static '路径' %}
但外部js无效
接收文件上传,在django没使用django.form的情况下
1.文件上传
file_path = 'backmanage/static/upload/' + timest + annex.name
f = open(file_path, 'wb')
for chunk in annex.chunks():
f.write(chunk)
f.close()
2.将已知字符串直接写入
content = request.body
f = open('mystone/static/files/'+str(time.time())[:-8]+':b'+str(uid)+'.txt', 'wb')
f.write(content)
f.close()
open
函数中,若为wb文件不存在会自动创建,文件存在会重写,但是路径中的文件夹不存在会报错。
将queryset转化为json
import json
from django.core import serializers
json_data = json.loads(serializers.serialize("json", queryset_data)
将model对象转化为json
from django.forms.models import model_to_dict
model_to_dict(instance)
django 默认datetime带时区,后跟.replace(tzinfo=None)
去除时区
Refused to display in a frame because it set 'X-Frame-Options' to 'deny'.在setting中加入X_FRAME_OPTIONS = 'ALLOWALL'
解决跨域
pip install django-cors-headers
在INSTALLED_APP中注册应用'corsheaders'
在MIDDLEWARE中注释掉'django.middleware.csrf.CsrfViewMiddleware'
新增'corsheaders.middleware.CorsMiddleware'
如果为True,则将不使用白名单,并且将接受所有来源。默认为False
CORS_ORIGIN_ALLOW_ALL = True
提交表单报错:RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and you have APPEND_SLASH set.
解决方法:
RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and you have APPEND_SLASH set.
提示form的action地址最后不是/结尾的,而且APPEND_SLASH的值是Ture
将from的action地址改为/结尾的就可以了
或者
修改settings:APPEND_SLASH=False