pycharm创建django项目常见问题

目录

目录

一.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,这样才能正常验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值