Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 操作错误:尝试在ubuntu服务器中写入只读数据库_Python_Apache_Ubuntu_Flask_Mod Wsgi - Fatal编程技术网

Python 操作错误:尝试在ubuntu服务器中写入只读数据库

Python 操作错误:尝试在ubuntu服务器中写入只读数据库,python,apache,ubuntu,flask,mod-wsgi,Python,Apache,Ubuntu,Flask,Mod Wsgi,我正在Ubuntu服务器上使用mod_wsgi和apache2运行一个FlaskApp。我尝试在localhost上成功运行flask应用程序,然后将其部署到ubuntu服务器上 但当我尝试更新数据库时,它给出了一个错误: Failed to update model. (OperationalError) attempt to write a readonly database u'UPDATE mysongs SET songurl=? WHERE songid.id = ?' (u'www

我正在Ubuntu服务器上使用
mod_wsgi
apache2
运行一个FlaskApp。我尝试在
localhost
上成功运行flask应用程序,然后将其部署到ubuntu服务器上

但当我尝试更新数据库时,它给出了一个错误:

Failed to update model. (OperationalError) attempt to write a readonly database u'UPDATE mysongs SET songurl=? WHERE songid.id = ?' (u'www.site.com/I_wanna_dance', 1)
现在我尝试查找数据库文件权限,该权限为:

-rwxr-xr-x 1 www-data www-data 10240 Jul 14 15:35 /var/www/mywebsite/appfolder/appdata.db`
当我尝试将权限更改为777、755、644等时,会显示另一个错误:
无法打开数据库文件
,尽管数据库文件在
本地主机
上使用644权限可以正常工作,但在ubuntu服务器上不能

此外,我还检查了目录的权限和
/var
/var/www
/var/www/mywebsite
/var/www/mywebsite/appfolder等,所有目录都将
www-data:www-data
作为其所有者用户名和组

我尝试过谷歌搜索,但除了建议更改file/dir权限之外,没有其他合适的解决方案,我自己也尝试过

为什么它不能读取/访问数据库文件


请提出建议。

解决了问题。这是由于数据库文件权限冲突。

此问题与文件权限管理有关,主要与Apache配置文件(
*.conf
)中选择的用户有关,该文件定义用于保存应用程序进程。简而言之,写入权限需要与此用户匹配

大多数情况下,sqlite数据库文件是由特定用户(例如您的当前用户)创建的,站点应用程序在Apache默认用户www data启动的子进程下运行(如果指令
WSGIDaemonProcess
中未指定参数
user
)。在这种情况下,可以读取数据库,但如果您试图修改任何内容,它将抛出此错误:

(操作错误)尝试写入只读数据库

因为www数据对文件(或父文件夹)没有权限


第一种方式:对用户www数据应用权限

您可以设置对数据库文件及其父文件夹的写入权限

如果文件夹包含其他文件,则可以对其添加写入权限,并仅将数据库文件的所有权更改为用户www数据,例如:

sudo chmod o+w db_directory
sudo chown www-data:  db_directory/site_database.db 
...
WSGIDaemonProcess main user=myuser group=myuser threads=3 python-home=/path/to/the/virtualenv/
WSGIProcessGroup main
WSGIApplicationGroup %{GLOBAL}
...
或者,如果文件夹仅包含数据库文件,则可以尝试直接更改文件夹所有者:

sudo chown -R www-data: db_directory
然后检查读/写权限设置是否正确(使用
ls-l site\u database.db

更多帮助


其他解决方案:添加特定用户以保留应用程序进程

这可以通过在Apache配置中的指令
WSGIDaemonProcess
中提供。 它将使Apache在特定用户下启动子进程

例如:

sudo chmod o+w db_directory
sudo chown www-data:  db_directory/site_database.db 
...
WSGIDaemonProcess main user=myuser group=myuser threads=3 python-home=/path/to/the/virtualenv/
WSGIProcessGroup main
WSGIApplicationGroup %{GLOBAL}
...
此用户将管理所有操作,包括对任何文件的读/写,因此请检查它是否具有对每个相关文件的所有所需权限

出于安全考虑,您不能使用宽权限用户

一些评论可以帮助解决这个问题



注意:如果在Apache配置中使用类似
ErrorLog
的指令管理自己的日志文件,请小心,这些文件将遵循相同的权限逻辑。应用程序可以更改的任何文件也是如此。

在IIS 7.5/Windows 2008服务器上托管Django Rest Framework时遇到了这个问题。在本地主机上运行良好。我添加了新功能来处理文件上传功能以及“文件名”。文件已正确上载,但数据库似乎不接受“文件名”字符串中的文本

解决方案: 转到您的问题数据库。(如果您没有分配任何特定的数据库,请考虑基文件夹中的文件d.qLITe3)

右键单击db.sqlite3-->属性-->安全-->编辑-->添加

在文本框中,输入Everyone-->Checkname-->ok


在IIS上刷新服务器并尝试运行应用程序。

只需为您的项目和数据库授予www数据权限即可

sudo chown www-data:www-data ProjectPath

sudo chown www-data:www-data dbPath

运行uwsgi时是否使用uid()和gid()。哪个用户启动uwsgi?您是否使用数据库文件的绝对路径?在mod_wsgi下,当前工作目录将不在您认为应该的位置,并且相对路径将失败。按理说,如果这是您正在做的,那么它甚至找不到数据库文件,但值得检查。另外,请确认web应用程序进程实际上是以www-data的形式运行的。您是否可以使用您的解决方案更新您的问题,以便人们在以后搜索时可以看到您所做的操作?修复:您需要在系统中查找数据库文件并授予写入权限。(例如git-access-to-all:sudo-chmod a+w file.db)您需要为您的项目和数据库授予www-data权限,请参见我的答案。对于SQLite,您还需要将数据库所在的目录写给代码运行的用户,否则它无法创建数据库锁文件。所以仅仅更改数据库文件的所有权是不够的。这个问题不适用于Windows。这是Ubuntu的。