OpenStack 界面开发中response.body的中文编码问题

本文探讨了在创建虚拟机过程中,用户输入中文字符导致的显示乱码问题,并提出了两种解决方案:一是限制用户输入中文;二是不改变输入限制,通过调整显示方式来避免乱码现象。
Contents [hide]

问题的引入=

G在我们创建虚拟机的时候,会设置虚拟机的名称,描述,如果没有限制用户输入,用户可以输入中文,会在页面呈现出乱码显示。

解决办法

用户限制输入中文

部分可行,但在用户自定义,如主机描述等必须可以输入中文的情况不适合。

不限制用户输入,呈现上修改

原来的实现方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
try:   
             response = httpclient.fetch(url,method=method, headers = headers)
         except Exception, e:
             return { "code" :e.code}
         #{"hypervisors": [{"id": 1, "hypervisor_hostname": "node-7.domain.tld"}]}
 
         body = eval (response.body.replace( "null" , "None" )).get( "servers" )
         servers = {}
         for b in body:
             print "*" *50
             ip_keys =  b[ "addresses" ].keys()
             try:   
                 for ip_key in ip_keys:
                     for address_ip in b[ "addresses" ][ip_key]:
                         if address_ip[ "OS-EXT-IPS:type" ] == "fixed" :
                             print address_ip[ "addr" ]
                             b.update({ "ip_addr" :address_ip[ "addr" ]})
                             raise ValueError
             except:
                 continue
         all_servers = { "servers" :body}
         return all_servers

本身eval函数是有使用风险的。修改方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
try:   
             response = httpclient.fetch(url,method=method, headers = headers)
         except Exception, e:
             return { "code" :e.code}
         #{"hypervisors": [{"id": 1, "hypervisor_hostname": "node-7.domain.tld"}]}
 
         #body = eval(response.body.replace("null", "None")).get("servers")
         body = json.loads(response.body)[ "servers" ]
         servers = {}
         for b in body:
             print "*" *50
             ip_keys =  b[ "addresses" ].keys()
             try:   
                 for ip_key in ip_keys:
                     for address_ip in b[ "addresses" ][ip_key]:
                         if address_ip[ "OS-EXT-IPS:type" ] == "fixed" :
                             print address_ip[ "addr" ]
                             b.update({ "ip_addr" :address_ip[ "addr" ]})
                             raise ValueError
             except:
                 continue
         all_servers = { "servers" :body}
         return all_servers

可以显示正常的中英文。然后在必须使用英文的地方加上输入限制。

转载于:https://www.cnblogs.com/CLTANG/p/4332660.html

<think>好的,用户遇到了OpenStack Glance服务启动失败的问题,具体报错是openstack-glance-api.service failed status=1/FAILURE start-limit。我需要根据提供的引用信息和常见解决方案来梳理步骤。 首先,查看引用的内容,用户可能已经尝试过修改服务配置,比如注释掉Restart=on-failure,但问题依旧。引用3中提到权限问题,比如日志文件的所有权可能不正确,导致服务启动失败。用户执行了chown -R glance:glance /var/log/glance/api.log,并且同步了数据库,之后成功启动服务。这说明权限和数据库同步可能是关键点。 另外,引用4显示部署过程中有初始化问题,可能涉及镜像拉取失败或Pod处于pending状态,这可能与网络或存储配置有关,但当前用户的问题是在服务启动阶段,所以可能需要先排除基础配置问题。 接下来,我需要整理常见的原因和解决方案: 1. **权限问题**:Glance的日志文件或相关目录权限不正确,导致服务无法写入。需要检查/var/log/glance等目录的所有者和权限,确保属于glance用户和组。 2. **数据库同步问题**:如果数据库没有正确同步,服务启动会失败。使用glance-manage db_sync命令进行同步,但必须以glance用户身份执行,如引用3中的su命令。 3. **配置文件错误**:检查Glance的配置文件(如glance-api.conf和glance-registry.conf)中的数据库连接、身份验证参数、存储后端设置是否正确。比如,数据库URL是否正确,Keystone的认证信息是否准确,存储路径是否存在且有权限。 4. **服务依赖问题**:Glance依赖的其他服务(如MariaDB、RabbitMQ、Keystone)是否正常运行。需要检查这些服务的状态和日志,确认无异常。 5. **日志分析**:查看/var/log/glance/api.log的具体错误信息,根据日志中的提示定位问题。例如,若日志显示数据库连接失败,则需要检查数据库配置和网络连通性。 6. **SELinux或防火墙**:SELinux可能阻止服务访问所需资源,可以暂时禁用SELinux或调整策略。防火墙规则是否阻止了必要的端口,如9292(Glance API端口)。 7. **服务启动限制**:systemd的启动限制可能导致服务无法重启,需要重置计数器,使用systemctl reset-failed命令,并检查服务配置中的Restart参数。 根据用户提供的引用,特别是引用3,用户通过修改日志文件权限和同步数据库解决了问题。因此,在解决方案中需要强调这两点,同时补充其他可能的检查步骤,如配置文件、依赖服务、日志分析等,形成全面的解决流程。</think>### OpenStack Glance服务启动失败问题解决方案 #### 一、检查日志定位问题根源 1. **查看服务状态和日志** ```bash journalctl -u openstack-glance-api.service -xe # 查看服务详细日志 tail -n 100 /var/log/glance/api.log # 检查Glance API日志 ``` 通过日志中的错误提示(如权限拒绝、数据库连接失败等)精准定位问题[^3]。 --- #### 二、关键修复步骤 2. **权限问题修复** Glance服务要求日志和存储目录必须属于`glance`用户: ```bash chown -R glance:glance /var/log/glance/ # 修正日志目录权限 chown -R glance:glance /var/lib/glance/ # 修正存储目录权限 ``` 3. **数据库同步操作** 未同步或同步失败的数据库结构会导致服务崩溃: ```bash su -s /bin/sh -c "glance-manage db_sync" glance # 以glance用户执行同步[^3] ``` 4. **配置文件校验** 检查以下配置文件中的关键参数: - `/etc/glance/glance-api.conf` ```ini [database] connection = mysql+pymysql://glance:GLANCE_PASS@controller/glance # 确认数据库连接正确 [keystone_authtoken] auth_url = http://controller:5000 username = glance password = GLANCE_PASS # 核对Keystone认证信息 [glance_store] stores = file,http # 存储后端配置 default_store = file filesystem_store_datadir = /var/lib/glance/images/ # 确认存储路径存在 ``` --- #### 三、依赖服务与系统环境 5. **检查依赖服务状态** ```bash systemctl status mariadb rabbitmq-server openstack-keystone # 确保数据库、消息队列、认证服务正常 ``` 6. **SELinux与防火墙** ```bash setenforce 0 # 临时关闭SELinux(测试用) firewall-cmd --add-port=9292/tcp # 开放Glance API端口 ``` --- #### 四、服务重启与验证 7. **重置systemd启动限制** ```bash systemctl reset-failed openstack-glance-api.service # 清除启动失败计数器 systemctl daemon-reload # 重新加载配置 systemctl start openstack-glance-api.service # 启动服务 ``` 8. **验证服务功能** ```bash openstack image list # 查看镜像列表 glance image-create --name test # 上传测试镜像 ``` --- #### 五、高级排查(若仍失败) - **查看完整调用栈** 若日志显示Python模块导入错误,可能是虚拟环境权限问题,需重装Glance组件: ```bash dnf reinstall openstack-glance # RedHat/CentOS apt install --reinstall glance # Ubuntu/Debian ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值