Django开发笔记

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必须一模一样才不会跨域。
localhost127.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'

image.png

解决跨域
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354