美文网首页
Django开发笔记

Django开发笔记

作者: Kairk996 | 来源:发表于2019-09-29 10:55 被阅读0次

    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:

    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

    相关文章

      网友评论

          本文标题:Django开发笔记

          本文链接:https://www.haomeiwen.com/subject/optfpctx.html