Спасибо за ваш ответ @Joe и @pjnola, как вы все предложили, я сослался на документы flask-login
Я обнаружил, что мы можем настроить класс анонимного пользователя, поэтому я настроил для мое требование,
Anonymous class
#!/usr/bin/python
#flask-login anonymous user class
from flask.ext.login import AnonymousUserMixin
class Anonymous(AnonymousUserMixin):
def __init__(self):
self.username = 'Guest'
Затем добавил этот класс в anonymous_user
login_manager.anonymous_user = Anonymous
Из этого он смог получить имя пользователя, если это был анонимный запрос.
Scala String
- это java.lang.String
, но Scala Boolean
не является java.lang.Boolean
. Следовательно, работает следующее:
import collection.jcl.Conversions._
import collection.mutable.{Map => MMap}
import java.util.Collections._
import java.util.{Map => JMap}
val jm: JMap[String, java.lang.Boolean] = singletonMap("HELLO", java.lang.Boolean.TRUE)
val sm: MMap[String, java.lang.Boolean] = jm //COMPILES FINE
Но ваша проблема по-прежнему связана с разницей Boolean
. Вам придется «свернуть» карту Java в карту scala: попробуйте еще раз, используя тип Scala Boolean
:
val sm: MMap[String, Boolean] = collection.mutable.Map.empty + ("WORLD" -> false)
val mm = (sm /: jm) { (s, t2) => s + (t2._1 -> t2._2.booleanValue) }
Тогда mm
- это карта scala, содержащая содержимое исходная карта Scala плюс то, что было на карте Java
Я думаю, что у меня есть частичный ответ ...
Если вы конвертируете карту java в карту scala с типами java. Затем вы можете отобразить его на карту scala типов scala:
val javaMap = new java.util.TreeMap[java.lang.String, java.lang.Boolean]
val temp = new collection.jcl.MapWrapper[java.lang.String,java.lang.Boolean] {
override def underlying = javaMap
}
val scalaMap = temp.map{
case (k, v) => (k.asInstanceOf[String] -> v.asInstanceOf[Boolean])
}
Недостаток этого плана в том, что тип scalaMap
является Iterable [(java.lang.String, Boolean)], а не картой. Я так близок, может ли кто-нибудь более умный, чем я, исправить последнее утверждение, чтобы это сработало?!
useJavaMap.scala
import test._
import java.lang.Boolean
import java.util.{Map => JavaMap}
import collection.jcl.MapWrapper
object useJavaMap {
def main(args: Array[String]) {
var scalaMap : Map[String, Boolean] = Map.empty
scalaMap = toMap(test.testing())
println(scalaMap)
}
def toMap[K, E](m: JavaMap[K, E]): Map[K, E] = {
Map.empty ++ new MapWrapper[K, E]() {
def underlying = m
}
}
}
test / test.java
package test;
import java.util.*;
public class test {
public static Map<String, Boolean> testing() {
Map<String, Boolean> x = new HashMap<String, Boolean>();
x.put("Test",Boolean.FALSE);
return x;
}
private test() {}
}
Командная строка
javac test\test.java
scalac useJavaMap.scala
scala useJavaMap
> Map(Test -> false)