Django开发中经常出现的问题

一、

RuntimeError: Model class apps.users.models.UserProfile doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. 

你是不是在项目目录里加了apps目录?

第一,你要在settings文件里添加:

sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

第二,在settings的INSTALLED_APPS引入你的app:apps.你的app名称就可以了。


二、

1,关于csrf错误:csrf跨站请求伪造,是对网站的一种恶意利用,django自带防止csrf攻击的手段,在form表单的action属性中,get不需要csrf认证,而post需要,一般来说有两种解决办法:1.启用csrf认证,在settings.py中启用中间件django.middleware.csrf 2.关闭csrf认证 注释掉django.middleware.csrf即可 
2,后台传列表或者字典给js函数 遇到中文显示成Unicode形式,二是引号被转义 解决时候传给js时候用json来处理 
3,文件的上传 在form中必须用POST,在form中要加入:enctype=“multipart/form-data” 
4,xlwt 在将大量数据写入到excel中,xlwt支持写到记录为65535,所以可以引用另外一个模块openpyxl 
5.外部机器无法访问本站点 然后在settings里修改ALLOWED_HOSTS = [], 改为ALLOWED_HOSTS = [‘*’,] 
6.django解决跨域请求的问题 解决方案:添加中间件,安装django-cors-headers 
7.当新增加的用户信息填写完成后,点击保存,然后出现了这样的错:IntegrityErrorat/admin/users/userprofile/add/ 
原因分析:外键约束。大概意思是:插入数据的时候,外键的值不是对应的主键的值。但是这时候表里是没有数据的,所以可能有主键值;插入数据时它的根节点可能不存在,所以插入失败。建议查询“外键”相关知识。两张表不是并列关系,而是父子关系。解决办法:取消外键约束 
8中文排序:数据库查询语句convert字段名转成jbk,”SELECT * FROM recommendGoods order by CONVERT(bigName USING gbk) , CONVERT(minName USING gbk)”

三、

跨站点脚本(XXS)攻击

跨站点脚本攻击是指一个用户把客户端脚本注入到其他用户的浏览器中。通常是通过在数据库中存储恶意的脚本,当这些脚本被检索然后展示给其他用户时实现的攻击的,或者诱使 用户点击攻击者的那些会被用户浏览器运行的脚本。django是如何应付的呢?

django的模板系统可以预防大部分的XXS攻击,然而我们要知道,django预防了那些,还有那些是预防不了的:django模板使用了”转义特殊字符“的方法转义了那些对html有危险的字符,然而,这不是一劳永逸的:

<style class={{ var }}>...style>

 

假如var的值是class1 οnmοuseοver=javascript:func()呢?这取决于浏览器如何处理这个不合法的html的了?

因此,当一定要在数据库中存储html的时候,请特别注意保证安全性,特别是这些html会被检索然后呈现给用户的时候!

跨站点请求伪造(CSRF)攻击

csrf攻击是在用户不知情的情况下,该用户的凭据被恶意的用户使用去执行某些动作。

django有内建的措施预防大多数类型的csrf攻击,然而,每一种预防的措施都会有自己的缺陷,比如你的站点有一些不在你控制范围的子站点。

除非万不得已,否则请不要使用csrf_exemp装饰器。

SQL注入攻击

SQL攻击是指恶意的用户可以在一个数据库上执行任意的SQL代码,这可能会带来数据丢失,删除甚至崩溃。

通过django的queryset,产生的SQL将被底层数据库驱动程序正确转义。然而,django也提供开发者写原生的查询和运行自定义的sql,这些都是隐患。

Clickjacking点击劫持

你有没有遇到过这样的情况,打开一个网页,出现一个flash广告框,你点击“关闭”按钮,可结果广告并没有关闭,却变成了全屏,这样的情况在计算机安全领域叫做点击劫持,也就是说你点击鼠标的行为被人给控制了。django的X-Frame-Options 中间件保护一个站点不被渲染成一个框架(html的frame),从而预防了点击劫持。

所以,任何没有必要在第三方站点被封装成框架的站点都应该启用这个中间件。

SSL/HTTPS

能安全总是更好的,尽管有时候并不实际。主要不是安全连接HTTPS,还是会有风险的,无论是认证凭据被截获还是客户端与服务器端的其他信息被转换,还是其他。

如果你想启用HTTPS,这是一些额外的需要配置:(这个配置我自己没有实现过,仅供参考,或许需要的时候我们可以私下讨论一下)

  • 如果需要,设置SECURE_PROXY_SSL_HEADER
  • 设置重定向,以方便HTTP可以转到HTTPS
  • 使用安全的cookie

主机头部验证

有些情况下,django使用Host头部去构造一些url,这些值在XXS攻击下是安全的,当对于CSRF,缓存中毒,毒性链接等时却不一定了。

因为这些看似安全的服务器,还是有伪装头部的嫌疑的。django通过对比ALLOWED_HOST和django.http.HttpRequest.get_host()来验证一个Host头部,记住,仅仅get_host方法是安全的,如果你仅仅使用request.META中的内容来校验host头部,那么你已经置django的安全防护于不顾了

 其他的安全问题

尽管django提供了很多的安全防护措施,但恰当的开发自己的应用和使用web服务器,操作系统和其他的组件的有用之处也是很重要的:

  • 确保你的python代码不在web服务器的根目录,这可以确保你的python代码不会被意外执行
  • 小心“用户上传的文件”
  • django不限制请求来验证用户身份,因此,为了避免认证系统遭受暴力攻击,你可能需要开发django插件或者web服务器模块来限制这些请求
  • 如果你的站点接受文件上传,请保证对这些上传有所控制以避免拒绝服务攻击(DOS),比如控制文件的大小
  • 不要泄露你的SECRET_KEY
  • 通过使用防火墙来限制你的缓存和数据库的访问

四、

createsuperuser时提示gender字段长度不够:

django.db.utils.DataError: (1406, "Data too long for column 'gender' at row 1") 
  • 1

解决:检查发现初始值female是6位,而设定长度为5,修改之后即可。然后执行:

# PyCharm:Tools --> Run manage.py Task
makemigrations users
migrate users
  • 1
  • 2
  • 3

找不到某个存在的对象:

ValueError: Lookup failed for model referenced by field courses.CourseResource.course: courses.apps.courses.Course
  • 1

解决: 
1. 尝试了网上的方法删除出问题的app下的数据库表和migrations,重新生成后依然有问题。 
2. 删除所有app下的数据库表和migrations文件,然后重新生成的时候出现了新问题: 
No migrations to apply.(django不能创建数据库中的表的问题) 
然后根据网友的方法解决新问题,无果,心累。 
3. 最终狠心删除了所有表(包括初始化的auth表之类的)和所有migrations文件夹,然后运行下面的命令重新生成就好了:

python manage.py makemigrations
python manage.py migrate
  • 1
  • 2

终于发现问题:由于前面每个app曾经被迁移到一个新建的apps文件夹,所以migrations中外建路径包含apps,删除apps即可。


使用xadmin模块的时候出现问题:

No module named import_export.admin
  • 1

缺少django-import-export这个包,但是安装不成功,后来试了一下卸载重装就OK了:

sudo pip uninstall django-import-export
sudo pip install django-import-export

谢谢观看!


你可能感兴趣的:(Django基础)