目录
目录
一.debug--TypeError: unsupported operand type(s) for /: ‘str‘ and ‘str‘,分析与解决
二.python点击run或者debug的时候出现Type ‘manage.py help <subcommand>‘ for help on a specific subcommand.
三.Django项目的settings.py文件中DEBUG参数置为False后,静态文件无法访问
四.Forbidden (Referer checking failed - no Referer.) 小程序访问djnago服务器报错referer检查未通过
一.debug--TypeError: unsupported operand type(s) for /: ‘str‘ and ‘str‘,分析与解决
在运行项目Django时候报TypeError: unsupported operand type(s) for /: ‘str’ and ‘str’,这是由于自动生成的代码中存在语法错误(在settings.py中的错误代码为 'DIRS': [BASE_DIR / 'templates']),将其修改为 'DIRS': [str.format(BASE_DIR, '/templates')],该问题原因是版本原因导致该处存在语法错误。其他的版本的pycharm创建后的目录拼接方式为:'DIRS':[os.path.join(BASE_DIR,'templates')],推荐使用第二种方法,这是使用os中的join函数进行拼接,可适应不同运行环境。
二.python点击run或者debug的时候出现Type ‘manage.py help <subcommand>‘ for help on a specific subcommand.
该问题是django项目运行需要默认参数,未添加参数直接点击run运行会报错。
其他参数添加方法类似
三.Django项目的settings.py文件中DEBUG参数置为False后,静态文件无法访问
参考博客:
关于Django setting.py 中设置DEBUG=False后静态文件无法加载_西奥斯的博客-优快云博客
首先修改项目的setting.py文件
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
# 设置上传文件的路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
url.py中加入
from django.contrib.staticfiles.views import serve #static静态文件
def return_static(request, path, insecure=True, **kwargs):
return serve(request, path, insecure, **kwargs)
urlpatterns = [
url(r'^static/(?P<path>.*)$', return_static, name='static'), # 添加这行
]
解释一下:我在url.py中写的return_static()的作用是代替 server() 为什么?以下是server()源码
def serve(request, path, insecure=False, **kwargs):
if not settings.DEBUG and not insecure:
raise Http404
server()默认情况下 insecure=False ,并且在关闭调试模式后都是 404。通过写个 return_static 函数其实与 --insecure 的选项是异曲同工的。
媒体文件的处理:
url.py中加入
from django.views.static import serve as static_serve # media媒体文件:注意这里引入的与上面的不同
urlpatterns = [
url(r'^media/(?P<path>.*)$', static_serve, {'document_root': settings.MEDIA_ROOT}),
]
完整的url.py代码:
这是总路由里的 不是APP应用整的url
from django.conf import settings
from django.conf.urls import url, include
from django.contrib import admin
from imserver import urls
from django.contrib.staticfiles.views import serve #static
from django.views.static import serve as static_serve # media注意这里引入的与上面的不同
def return_static(request, path, insecure=True, **kwargs):
return serve(request, path, insecure, **kwargs)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include(urls)),
url(r'^static/(?P<path>.*)$', return_static, name='static'),
url(r'^media/(?P<path>.*)$', static_serve, {'document_root': settings.MEDIA_ROOT}),
]
四.Forbidden (Referer checking failed - no Referer.) 小程序访问djnago服务器报错referer检查未通过
该错误的前提是django服务器开启了CSRF安全防护机制,报错如下:
报错原因是Referer 检查失败,分析原因是发送的请求请求头虽然添加了X-CSRFtoken字段,但没有添加Referer,但查阅小程序文档发现,微信小程序的wx.request中不能添加referer字段。
因为小程序和服务器通信实际上是微信小程序-->腾讯服务器-->目标服务器,请求返回的路径刚好相反。
网络请求的 referer 是不可以设置的,格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版,版本号为devtools代表是开发工具发出的请求。
既然不能设置小程序端referer,那就要在django服务器端设置,通过查看官方文档发现settings.py中有一个参数:CSRF_TRUSTED_ORIGINS 可设置服务器信任的不需要验证的标头,所以将报错中出现的网址添加至上述参数中即可。
然后即可正常使用CSRF验证,关于小程序如何获取django服务器中的token可参考如下博客,
Django前后端分离csrf token获取方式 - 自学编程网
在请求头中添加X-CSRFToken后还需要添加cookies,这样才能正常验证。